Help us understand the problem. What is going on with this article?

Transactionの中で意図的にロールバックさせたい

More than 1 year has passed since last update.

ActiveRecord::Base.transactionはとっても便利です
save!メソッドなどの例外を拾ってロールバックを自動でかけてくれます
トランザクションの中でロールバックを意図的にかけたいときがあると思います

ダメな例

begin
  ActiveRecord::Base.transaction do
    if xxx_method # trueかfalseを返すメソッド
      xxx
    else
      raise ActiveRecord::Rollback # ロールバックは実行される
    end   
  end
rescue e => 
  # ここは実行されない
  Rails.logger.error(e)
end

良い例

ActiveRecord::RecordNotSavedでもロールバックが走るため、こちらを例外として投げてあげると、
rescueでキャッチすることができる

begin
  ActiveRecord::Base.transaction do
    if xxx_method # trueかfalseを返すメソッド
      xxx
    else
      raise ActiveRecord::RecordNotSaved
    end   
  end
rescue e => 
  # 実行される
  Rails.logger.error(e)
end
MotohiroSiobara
Spring Boot勉強中
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away