LoginSignup
3

More than 5 years have passed since last update.

RailsのTransactions 初心者→中級者へのSTEP16/25

Last updated at Posted at 2018-12-16

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3