ume

transactionの概要と使い方

トランザクション(transaction)とは

トランザクションとは複数の処理をまとめて1つの大きな処理として扱う機能です。 また複数の処理の内、1つでも例外が発生したら、処理全体を巻き戻す(ロールバック)ことができます。

def exec_transaction
  ApplicationRecord.transaction do
    処理A  # ← 成功!
    処理B  # ← 成功!
    処理C  # ← 失敗!
  end
end

処理A、Bは上手くいったけど、Cはダメだった、、ここで処理Cで例外を発生させれば処理A、B、Cは全て無かったことに!!

これの嬉しいところはデータベース内のデータの整合性が保たれる。

どういうことかというと.
例えば、お母さんが息子に、銀行のATMで6000円送金する場合を考えてみる。送金の手順を単純化すると、2つの処理があると考えられます。

(1)お母さんがの銀行残高が6000円を減る
(2)息子の銀行残高が6000円増える

もしお母さんの6000円の送金処理は完了したけど、システムの不具合で息子の残高が6000円増えていないといったエラーが発生した場合。 母の6000円が無くなっただけになる。 それはいけないので(1)と(2)のどちらか1つでも処理に失敗したら両方処理を無かったことにしてくれる。よってデータベース内のデータに整合性が保たれる=母の残高は-6000円と減っているけど息子の残高は増えていないのような不具合は発生しない。

使用方法

ActiveRecord::Base.transaction do
  処理
end

トランザクション注意点

トランザクションブロック内の処理が例外を起こさない限りロールバック処理は行われない

ApplicationRecord.transaction do
  A.save
  B.save
end

上記のコードでは、A、Bのどちらかのsaveに失敗しても返り値falseが返るだけで、例外は発生せず、ロールバックも行われません