1
0

rails transaction が rollback しないのは マルチデータベースだからかもしれない話

Posted at

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.transactionUserDatabase.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
1
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
1
0