Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

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

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
3
Help us understand the problem. What are the problem?