ActiveRecord::Base.transaction の最中に return すると何が起こる?
Ruby において、 block の中の break や return は、その block が定義された時の method call をただちに終了させる効果があると理解しました。
この場合ふと次のことが気になりました:
- block の中で break や return が呼ばれる可能性によって、 block を yield する method は、どうがんばっても、 ensure 的に最後に実行する処理というものは記述できない。
- rails における
ActiveRecord::Base.transaction
は block を引数(厳密にはちがうけれども)にとって、その中身を transaction の文脈で yield している(はずだ)と理解できるけれども、しかし 1. を考慮すれば、開始した Transaction を確実に終了 (commit もしくは rollback によって) させるようなコードは transaction メソッドの中では記述できない
そうすると次の疑問が発生します。
質問
- rails において、
ActiveRecord::Base.transaction
の block の中で直接、 break や return を実行した場合においては、その transaction メソッドの Database に対する操作はどのようなものになりますか?可能性として以下がありうるかな、と思っています。- commit される
- rollback される
- transaction が開始され、その commit/rollback のどちらも行われない中途半端な状態になる
宇宙の法則が乱れて、active record の動作が未定になる- ...