- PR -

何度も同時に処理が走ってしまう

投稿者投稿内容
べんとろえだ
会議室デビュー日: 2006/12/08
投稿数: 10
投稿日時: 2008-08-21 14:17
jspのプログラムから、以下のようにサーバ処理を起動しているのですが、何度も同じ処理が勝手に走り出し、困っています。

<form name="frmMain" action="Add.do" method="post">

登録ボタン押下時に
document.frmMain.submit();
を行う。


サーバ処理(Add.doで呼ばれる処理)では、以下の処理を行っています。

1)トランザクション開始
2)INSERT テーブルA
3)一旦 commit
4)新たにトランザクション開始
5)SELECT * FROM テーブルB FOR UPDATE;
6)UPDATE テーブルB
7)commit


そこで、以下の動作を期待しています。

<期待される動作>
テーブルBがロックされていた場合、5)で待ちが発生し、ロックが解除されたら6)で更新から処理が再開。
但し、上記3)の通り訳あって別トランザクションにしているので、5)で待っている時点で既にテーブルAは更新されている。


しかし、開発環境と試験環境では動作が異なっており、原因が分からず困っています。
尚、Seaser,S2DAO,Apatch を使用しています。

<開発環境>(WindowsXP上でeclipseを使用してローカルにサーバを立てて実行、IE7)
上記期待通りの動作


<試験環境>(Unix上でWebサーバを立て、クライアントはWindowsVista、IE7)
同時に何度もスレッドが走り、1)からの処理を繰り返し、2)でORACLEのキー重複エラーが起こる。
(まったく同じINSERT文を実行しているので、重複エラーだけについて言えば、は正しい結果です)
まるで、登録ボタンを何度も押したかの様な動作が勝手に何度も走ってしまいます。


ログは以下のような感じです。(時間はおおよそです)

2008/08/21 10:00:00 DEBUG [TP-Processor1] (Logger.java) - INSERT テーブルA
2008/08/21 10:00:10 DEBUG [TP-Processor1] (Logger.java) - トランザクションをコミットしました
2008/08/21 10:00:20 DEBUG [TP-Processor1] (Logger.java) - SELECT * FROM テーブルB FOR UPDATE;
<<<このあとしばらく排他の待機をした後、突如別スレッドが現れ1)から処理を再開する>>>
2008/08/21 10:01:00 DEBUG [TP-Processor3] (Logger.java) - INSERT テーブルA
<<<ORACLEのキー重複エラー>>>
2008/08/21 10:01:10 DEBUG [TP-Processor3] (Logger.java) - INSERT トランザクションをロールバックしました
<<<以降、なんども別スレッドが現れ、その度にエラーになる>>>
2008/08/21 10:01:20 DEBUG [TP-Processor7] (Logger.java) - INSERT テーブルA
2008/08/21 10:01:30 DEBUG [TP-Processor7] (Logger.java) - INSERT トランザクションをロールバックしました
2008/08/21 10:01:40 DEBUG [TP-Processor9] (Logger.java) - INSERT テーブルA
2008/08/21 10:01:50 DEBUG [TP-Processor9] (Logger.java) - INSERT トランザクションをロールバックしました



Javaの言語のみについて言えば、VB、Cの経験もあるので大体分かるのですが、Webアプリについては殆ど分かっていない為、書かせて頂いた内容にかなり不備があると思いますが、御指摘いただければ出来るだけ御提示させて頂きたいので、どうか対応策等、御教示お願いいたします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-08-21 14:44
Apatch > Apacheです

Javaに限らずウェブアプリでやってしまいがちなのが、無限リダイレクトです。
サーブレットならフォワードの概念があるので、
無限フォワードになっているかもしれません。

無限リダイレクトなら、単純にリクエストログを見ればわかります。
処理が何度も走るのは、単に何かの問題に対する結果でしかありません。
実際に何が起こったために連続処理が動くのかを、
まずは突き止めてみてはいかがでしょう。
べんとろえだ
会議室デビュー日: 2006/12/08
投稿数: 10
投稿日時: 2008-08-22 20:35
御返答ありがとうございます!

> Apatch > Apacheです

すみません・・・御指摘通り記述ミスです・・・。

いろいろ調べてみてはいるのですが、未だよくわからない状況です・・・。

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2008-08-24 22:00
> いろいろ調べてみてはいるのですが、未だよくわからない状況です・・・。
色々、何を調べているのでしょう?

かつのりさんが指摘されているアクセスログは確認されましたか?
アクセスログを確認すればブラウザが多重リクエストを行っているのかどうかが確認できます。
つまり、「何度も同時に処理が走ってしまう」原因がクライアントサイドにあるのかサーバサイドにあるのかを切り分けられますね。
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2008-08-25 09:47
Firefox + firebug を使えば無限リダイレクトなど問題が切り分けやすいですよ
接続タブのHTMLを開けば、GET POSTなどの詳細なログがクライアント側で簡単に確認できます。
べんとろえだ
会議室デビュー日: 2006/12/08
投稿数: 10
投稿日時: 2008-08-25 13:37
>インギさま、わたなべさま

言葉足らずですみません・・・。
フレームワークのログからは、複数スレッドが(こちらは質問内容の通りです)、
アクセスログからは多重リクエストが走っていることまでは確認できていて、
開発環境と試験環境のWEBサーバの環境の設定の違いかと思い調べているのですが
設定ファイルなどはまったく同じものを使用していて、違いが見つけられていません。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-08-25 15:54
設定が同じだから、具体的な検証なんかする必要ないってことですか?
開発環境なら問題なかったバグが、実機や試験環境で発生することは多々有ります。

入力、データ、処理、出力が同じなら、全く同じに動きますが、
違う部分があるから開発環境ではでないバグが発生しているわけです。
アクセスログのURLを読んだり、エラーログを読んだり、
あとは、デバッグコードを埋め込んでデプロイするとか、
色々と対処方法はあるはずです。

どんなプログラムが動いているかなんて、回答者にはわかりません。
ですので、設定が同じなのに動かないといわれても、
正直回等に困ってしまいます。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2008-08-25 16:24
>アクセスログからは多重リクエストが走っていることまでは確認できていて
と自分で言っているのですから、
クライアント側の問題でしょ。

スキルアップ/キャリアアップ(JOB@IT)