#RailsのTransactions
##はじめに
やっぱり今日はTransactionについて書きます。キャッシュはまた今度にします。
##トランザクションとは
簡単にいうと、複数のSQL文の集まりです。transaction
は訳せば取引です。webアプリケーションでは例えばユーザ間での何かしらのやりとり、取引が起きた時、双方のデータを更新すべき時があります。
例えば、Aさんの口座からBさんの口座に100円渡す時、Aさんの口座情報と、Bさんの口座情報を両方更新されなければなりません。片方だけ更新が成功されることは起きてはなりません。片方が失敗したなら、もう片方も更新されてはなりません。この更新がする前に戻るべきです。
そんなまとめて処理されるべき更新のSQL文の塊をトランザクションと言います。
##Railsでどう実装するのか
実装の仕方はシンプルで、下記のようにブロック内にまとめたい処理を書いてくだけです。
ActiveRecord::Base.transaction do
#まとめたい処理たち
end
##サンプル例
2つのユーザーが同時に保存されなけらばいけない場合。
def create
User.transaction do
user1 = User.new(:name => 'tarou')
user1.save!
user2 = User.new(:name => '')
user2.save!
end
p '更新に成功しました'
rescue
p 'ロールバック'
end
処理が失敗した場合、save!
でないと例外を吐いてくれないのでロールバックされません、注意です。例外を吐くメソッドを使用しましょう。
これでuser1,user2の保存に成功しないと、この処理はロールバックされます。
##まとめ
今日は軽くにして明日このtransactionmを深く掘り下げていきたいです。
##参考にしたの
Railsのデータロック
https://qiita.com/merrill/items/d9d41d64df292bd6432a
Active Record Transactions
https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html