やったこと
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 が実行されていることが分かります