Rails で意図的に fail させているのに rollback しない!
このようなコードを書いた時には確実に rollback しますが
マルチデータベースの場合は rollback が行われないこともあります。
ActiveRecord::transaction do
User.last.update!(name: 'new name')
raise 'hoge'
end
class User < UserDatabase
end
トランザクションのスコープ
Rails では、トランザクションは特定のデータベース接続に紐付けられ
UserDatabase クラスまたはそのサブクラスでトランザクションを開始した場合
そのトランザクションは UserDatabase の 接続先DBでのみ有効になります
対象DBにつながっているクラスでトランザクションを開始する
ActiveRecord::transaction で開始するのではなく
User.transaction
や UserDatabase.transaction
で開始する
接続先が UserDatabse なので正常に rollback します
UserDatabase::transaction do
User.last.update!(name: 'new name')
raise 'hoge'
end
こちらも同様に UserDatabse を継承している User モデルを利用するので
正常に rollback します
User::transaction do
User.last.update!(name: 'new name')
raise 'hoge'
end