へなちょこSEの考察

0x22歳のへなちょこSEが、日々思うことを考察します。自社内、金融系を経て現在法人系PKG開発に従事。

DBMS_SCHEDULERをPL/SQLの中で使うとトランザクションが効かない

DBMS_SCHEDULERを使っているPL/SQLで、エラーが起きた際にロールバックしようとしたが、ロールバックできない事象が発生した。
いろいろ試してみた結果、ExceptionをCatchした中でDBMS_SCHEDULERのDROP_JOBを呼んでいたのだが、これが呼ばれるとトランザクションが強制コミットされているらしい。
その直前にRollbackを追加してやったら、期待したとおりにデータがロールバックした。

DBMS_SCHEDULERはExceptionの中でDROP_JOBしてやらないと、エラーの際にJOBが残り続けてしまう(作りによっては)。
なので、ExceptionでCatchした際は先にRollbackを実行してからDROP_JOBを実行する必要がある。

また、同様にCREATE等でも同じことが起こると思われる(試してないが)ため、ジョブを作るのは一番最初に実行しておいて、テーブルのUPDATE等を実施し、最後にJOB削除、という流れを経る必要がある。
どーりでエラー投げてもデータが登録されてしまうわけだ。。。