ransationの目的は、コードブロックにあるSQL文の変更を、全部成功することを守るための存在である。Transactionにより、データの統一性を保ことができる。銀行などの受け入れと引き出しの処理をする際に引き出したが受け入れに失敗した際などに引き出しの処理をなかったことにすることができるのでデータの不整合を防ぐことができる。
ActiveRecord::Base.transaction do
#ここに保存するなどの処理を追加
user.save!
post.save!
end
transactionで囲んだ範囲で処理に失敗してなかったことにすることをロールバックといい、ロールバックが発火するには「例外」が必要である。なのでtransaction内では ! マークをつけて例外をスローする必要がある。ex)save!,update!,destroy!
def hogefuga
ActiveRecord::Base.transaction do
#ここに保存するなどの処理を追加
user.save!
post.save!
end
rescue ⇒ e
#ロールバック後に実行
end
rescueで例外が発生した場合の処理を記述することも可能。rescueにエラーの詳細を指定することも可能。
注意したいのが、トランザクション内にrescueを記入すると、ロールバックが実行されずにrescue内を実行してしまう。