例
内側でロールバックを実行してもコミットされてしまうようだ
p Example.count
ApplicationRecord.transaction do
ApplicationRecord.transaction do
Example.create
end
raise ActiveRecord::Rollback
end
p Example.count # カウントが増えてしまう
単純なコードであれば気づくが、コードが入り組んでいる場合は注意
外側の制御で回避
外側のトランザクションで joinable: false
を指定すると、外側のトランザクションへの合流を防げるようだ
p Example.count
ApplicationRecord.transaction(joinable: false) do
ApplicationRecord.transaction do
Example.create
raise ActiveRecord::Rollback
end
end
p Example.count
回避 - 内側の制御
内側のトランザクションで requires_new: true
を指定すると、外側との合流を防げるようだ
p Example.count
ApplicationRecord.transaction do
ApplicationRecord.transaction(requires_new: true) do
Example.create
raise ActiveRecord::Rollback
end
end
p Example.count
参考
ActiveRecord - ネストしたトランザクションの落とし穴 #Rails
チャットメンバー募集
何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。