4

複雑な SQL を実行し、いずれかが失敗した場合はすべてロールバックする必要がある Java アプリを作成しています。

  • を使用してSybase接続を開きますnet.sourceforge.jtds.jdbc.Driver
  • setAutoCommit(false) を呼び出す
  • SQL1 を行う
  • ストアド プロシージャ 'MySP1' を呼び出す
    • ストアド プロシージャ MySP1' は私の管理下にありません
    • それは持っていますEXEC sp_procxmode 'dbo.MySP1','unchained'
  • SQL2 を行う
  • SQL2 が失敗した場合は、すべて (SQL1 を含む) をロールバックし、それ以外の場合はコミットします。

これを行うと、MySP1 から次のエラーが表示されます。

ストアド プロシージャ 'MySP1' は、非連鎖トランザクション モードでのみ実行できます。' SET CHAINED OFF' コマンドは、現在のセッションで非連鎖トランザクション モードを使用します。


次のことを試しましたが、すべて役に立ちませんでした。

  1. getConnection()メソッド (アドバイス ソース)に渡される Properties オブジェクトに「chained=false」を追加します。

    おそらくプロパティをサポートしてnet.sourceforge.jtds.jdbc.Driverないように思われるため、これは効果がありませんでした。chained

  2. getConnection()メソッド (アドバイス ソース)に渡される URL 文字列に「chained=false」を追加します。

    これも効果無かった

  3. SET CHAINED OFFの後に SQL を呼び出しますsetAutoCommit():

      PreparedStatement st = conn.prepareStatement("SET CHAINED OFF");
      st.execute();
    

    これは効果がありませんでした。

  4. setAutoCommit()仕組みを調べた

    これにより、ドライバーにバグがある可能性があると信じるようになりました。ただし、その場合、#1-#3 はバグを回避する必要があります。

  5. setAutoCommit(true)の代わりに呼び出されsetAutoCommit(false)ます。

    これにより、非連鎖モードに関するエラーが修正されましたが、私が理解している限り、最初の SQL ステートメントはその時点までに既に自動コミットされているため、最後に SQL を 100% ロールバックできないことを意味します。

4

2 に答える 2