Rails5 でトランザクションを使う
Ruby Ruby on Rails
Published: 2019-05-19

やったこと

Rails5 でトランザクションを使ってみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails -v
Rails 5.1.6.2

調査

調査用のモデル生成

$ rails generate model Task email:string

id=1 のデータを2件登録しようとしてみます。

$ rails c
...
irb(main):006:0> ActiveRecord::Base.transaction do
irb(main):007:1*   task = Task.new
irb(main):008:1>   task.id = 1
irb(main):009:1>   task.save!
irb(main):010:1> end
   (0.1ms)  begin transaction
  SQL (0.9ms)  INSERT INTO "tasks" ("id", "created_at", "updated_at") VALUES (?, ?, ?)  [["id", 1], ["created_at", "2019-05-18 17:22:26.459793"], ["updated_at", "2019-05-18 17:22:26.459793"]]
   (1.6ms)  commit transaction
=> true
irb(main):011:0> ActiveRecord::Base.transaction do
irb(main):012:1*   task = Task.new
irb(main):013:1>   task.id = 1
irb(main):014:1>   task.save!
irb(main):015:1> end
   (0.1ms)  begin transaction
  SQL (1.0ms)  INSERT INTO "tasks" ("id", "created_at", "updated_at") VALUES (?, ?, ?)  [["id", 1], ["created_at", "2019-05-18 17:23:01.683041"], ["updated_at", "2019-05-18 17:23:01.683041"]]
   (0.1ms)  rollback transaction
Traceback (most recent call last):
        2: from (irb):11
        1: from (irb):14:in `block in irb_binding'
ActiveRecord::RecordNotUnique (SQLite3::ConstraintException: UNIQUE constraint failed: tasks.id: INSERT INTO "tasks" ("id", "created_at", "updated_at") VALUES (?, ?, ?))

1回目の登録は、 commit されていて

2回目の登録は、 rollback が実行されていることが分かります

参考

【Rails】絶対に抑えたいTransactionのポイントを三つにまとめてみた。【必須】 - Qiita