🖥

Rails – トランザクションをネストするとロールバックが効かない

に公開

例

内側でロールバックを実行してもコミットされてしまうようだ

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

Railsにおけるネストしたtransactionの挙動

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2023-11-20

Discussion