2011-08-02 4 views
0

私はJDBCとインラインSQLステートメントを使用する従来のJSPアプリケーションを開発中です。JDBCステートメント注文

データベース内の不正なデータに問題があり、2つのステートメントをコードで指定されている順序とは異なる順序で実行できるかどうかは疑問です。つまり、次の例のように実行される2つの更新ステートメントがある場合です。

String sql1 = "update table set x = y"; 
String sql2 = "update table set z = a"; 
Statement statement = conn.createStatement(); 
db_wrapper.runSQL(sql1,statement); 
db_wrapper.runSQL(sql2,statement); 

重大な負荷がかかっていると、2番目のSQL文がデータベースによって最初の文より前に実行される可能性はありますか。

私たちはほとんどがoracleデータベースで実行すると問題が発生しています。

また、このコードでは現在トランザクションを使用していません。

+1

トランザクションを使用する - 簡単な修正のように聞こえます。あなたは結局 'Connection'インスタンスを持っています。どのデータベース(「oracle」以外)、どのバージョンのドライバ、どのJVM、どのプラットフォーム、どのサーブレット・コンテナを使用しているのか、使用中のハードウェア、実行中のプロセスのリストを教えても...それは誰も推測以上の何かを持っている可能性は低いです。 – Paul

+1

'db_wrapper'とは何ですか?リクエストを同期して送信していますか?または非同期ですか? –

+0

例外処理を伴うstatement.executeUpdateなどのラッパーです。 – eaglestorm

答えて

2

いいえ、そのスレッドはOracleドライバをこの順序で呼び出します。メソッド呼び出しの明示的な並べ替えや、JDBCの並べ替えや照会はありません。しかし

  1. あなたはあなたのコードは、データベースへの呼び出しをバッファリングし、最終的には異なる順序でそれを実行するか、異なる接続に送信されていませんか?異なる接続にクエリを送信すると、2番目のステートメントを実行している接続の1つが最初のステートメントの前に終了し、最初のステートメントが失敗する可能性があります。
  2. 呼び出しの戻り値を確認していますか?または例外ですか?あなたのコードでチェックされていない何らかの理由で最初のクエリが単に失敗することはありますか?たぶんcatch'd、どこかに(システムのような)不明瞭なログに記録し、真剣に取らない?
  3. ドライバが変な動作をする可能性があります。どのバージョンのOracleを使用しているのかわかりませんが、JDBCドライバは自由に操作できます。
  4. 負荷が高い場合、複数のスレッドがJSPを実行するため、コードが適切に同期されていないか、クエリが適切にスコープされていないと、奇妙なことが起こる可能性があります。
0

データは、更新の実行をコミットする順番で表示されます。