このようなDB2ストアドプロシージャを作成しています
create or replace procedure test()
dynamic result sets 1
begin
//declaration of variable goes here
declare continue handler for sqlexception set errstate = sqlstate;
savepoint save1 on rollback retain cursors;
//some transaction
if errstate <> '00000' then
rollback to savepoint save1;
end if
//return errstate as result set
end@
それでも、何らかの理由で errstate が「00000」でない場合 (おそらくデッドロック)、取得した errstate は 3B001 であり、これは作成したセーブポイントが存在しないか無効であることを表します
自動コミットをオフにしようとしましたが、それでも機能しません。さらに、私の理解では、上記のクエリは単一のトランザクションとして扱われるため、必ずしも自動コミットをオフにするわけではありません
CentOS 6.5で実行されているDB2 ESE 10.5上
なにか提案を?
- - -ノート - - -
変更することで問題を解決できました
rollback to savepoint save1
ただに
rollback
これで問題は解決しますが、「ロールバックからセーブポイントへのセーブ1」を使用しただけで特定のセーブポイントへのロールバックを拒否した理由はわかりませんが、「ロールバック」だけを使用すると機能しますか? なぜこれが起こっているのか、誰かが私に説明するのを手伝ってもらえますか?