複雑な 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
' コマンドは、現在のセッションで非連鎖トランザクション モードを使用します。
次のことを試しましたが、すべて役に立ちませんでした。
getConnection()
メソッド (アドバイス ソース)に渡される Properties オブジェクトに「chained=false」を追加します。おそらくプロパティをサポートして
net.sourceforge.jtds.jdbc.Driver
いないように思われるため、これは効果がありませんでした。chained
getConnection()
メソッド (アドバイス ソース)に渡される URL 文字列に「chained=false」を追加します。これも効果無かった
SET CHAINED OFF
の後に SQL を呼び出しますsetAutoCommit()
:PreparedStatement st = conn.prepareStatement("SET CHAINED OFF"); st.execute();
これは効果がありませんでした。
setAutoCommit()
仕組みを調べたこれにより、ドライバーにバグがある可能性があると信じるようになりました。ただし、その場合、#1-#3 はバグを回避する必要があります。
setAutoCommit(true)
の代わりに呼び出されsetAutoCommit(false)
ます。これにより、非連鎖モードに関するエラーが修正されましたが、私が理解している限り、最初の SQL ステートメントはその時点までに既に自動コミットされているため、最後に SQL を 100% ロールバックできないことを意味します。