Railsのトランザクションとその例外処理
トランザクションとは
一言で表すと、[ここからここまでワンセット]な処理単位
のこと。
例えば買い物するときに、
1.代金を払う
2.商品を受け取る
最低限この2つの動作を行うが、仮にこの動作のうち1つだけしかしなかった場合、商品を受け取って代金は払わずにいたとき、それは「買い物」ではなく「物を貰う」行為になる。
2つの動作が合わさって初めて買い物という処理(トランザクション)と言える。
基本構文
ActiveRecord::Base.transaction do
# 例外が発生するかもしれない処理
end
# 例外が発生しなかった場合の処理
rescue => e
# 例外が発生した場合の処理
transaction
ブロック内で例外が発生した場合、ブロック内で行われたデータベース更新処理が全てロールバックされる。
transaction
を機能されるためには例外を発生させる必要がある。
つまり save!
やcreate!
などを使う必要がある。
例外処理とは
プログラムがエラーで異常終了するケースでもプログラムを中断させず、別の処理に切り替えるプログラムが例外処理。
rescue
は、エラーによって生成された例外オブジェクトを「rescue => e」
で受け取り、「e.message」
に格納されたエラー内容を表示する。
またrescue
にはエラータイプを指定できる。通常のプログラムで発生する可能性の高い例外クラスのStandardError
が多く適用される。
使い方
こではPayment(入金)
、PaymentHistory(入金履歴)
のModel
が存在するとする。入金があると入金履歴も作成する処理を見ていく。
def create
ActiveRecord::Base.transaction do
payment = Payment.new(amount: 1000)
payment.save! # まだコミットされない
payment_history = PaymentHistory.new(
amount: 1000,
payment_day: Time.zone.now.strftime('%Y/%m/%d/%H時%M分%S秒')
)
payment_history.save! # まだコミットされない
end
true
# transactionブロックを正常に抜けるとコミットされる
rescue StandardError
false
end
参考記事
Author And Source
この問題について(Railsのトランザクションとその例外処理), 我々は、より多くの情報をここで見つけました https://qiita.com/mmaumtjgj/items/cdcdbd9ee0fe02e0f883著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .