0
0

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

Posted at

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

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オープンチャットもご利用ください。

Twitter

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0