質問: トランザクションのネストについて トランザクションのネストについて お世話になります。 今、ストアドの中でストアドを実行するようなsqlを作成しているのですが、 このときのトランザクション処理について教えていただきたいです。 簡単な流れとしましては aトランザクション開始(大枠のストアド) ↓ 処理a ↓ bトランザクション開始 ↓ (aストアドの中のストアド実行) ↓ bコミット ↓ 処理b ↓ aコミット といった感じなのですが、bストアドでコミットするとbストアドをcallする前の処理aが コミットされてしまいます。 ここはbはbだけでコミットされてほしいのです。 独自で調べた限りでは、「トランザクションのネストはmysqlではできない」ということらしいのですが、 こういった場合、どのようにしたらよいのでしょうか。 もし方法があれば、ご教示のほどお願い致します。 -環境- [db mysql 5.0] [os windows xp]
回答: トランザクションがネストできないdbシステムは 他にもあります。できる方が少ないくらいです。 仮にできたとしても、外側のトランザクションが ロールバックすると、内側のコミットも無効に なるはずです。トランザクションは更新の適合性を 保証するのですから、一部成功、一部失敗という ことが無いようにするのが目的だからです。 ご希望の処理はこの「一部成功、一部失敗」を 認めろということになりますので、基本的には 処理シーケンス(設計)が間違っていると思います。 bトランザクションではトランザクションを作らずに 一時テーブルを使って結果を残し、処理b、あるいは aコミット/ロールバックの後で一時テーブルから 更新を復元するような手順を考えてみたら如何でしょう。