Skip to content

Instantly share code, notes, and snippets.

@kyuma-git
Last active July 20, 2019 04:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kyuma-git/093ac7c801df92a735e27b125112237a to your computer and use it in GitHub Desktop.
Save kyuma-git/093ac7c801df92a735e27b125112237a to your computer and use it in GitHub Desktop.
ActiveRecord::Base.transactionについて
◎ ActiveRecordにおけるTransction
トランザクションとは、一連の処理すべてが成功した場合にのみデータベースが更新される(コミットする)仕組みである。ブロックで囲むことでトランザクションの範囲を指定でき、もしそれらの処理の一つでも失敗すると、ブロック内の全ての処理が巻き戻される(ロールバック)。
ActiveRecordでは、以下のように記述することで実装できる。
```
ActiveRecord::Base.transaction do
ここに処理を記述
ここに処理を記述
end
```
◎ 用途
データの生合成を保つために、不可分性の高い処理はトランザクションブロックで扱うことが望ましい。
例えば、Aさんが銀行ATMで5万円をBさんに送金する場合、以下の二つの処理が必要となる。
処理1. AさんがATMに5万円を入れる
処理2. Bさんの口座に5万円が入る
もし、処理1が正常で処理2でエラーが発生した場合、Aさんが入金したにも関わらず、Bさんの口座のお金は増えていないという、非常に望ましくないことになる。
そのため、こうした処理の場合はトランザクションで「送金」というブロックとして括るようにする。
◎ 注意点
・ 複数のデータベースへのアクセスを含むと、処理待ちでアクセス禁止になり得る。そのためトランザクションは最小限に抑える
・ 例外が発生するとロールバックが走るため、処理失敗時に例外が走るメソッドを必ず書く
◎ トランザクションまとめ
・ 複数のデータベースへのアクセス、複数の処理をまとまった処理として扱う
・ 一つでも失敗した場合は、トランザクション全体として失敗となる
参考
https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
https://qiita.com/komattio/items/838ea5df68eb076e8099
http://itdoc.hitachi.co.jp/manuals/3000/30003F5120/EEUG0038.HTM
https://qiita.com/shunsuke227ono/items/c9c38c24beee33db0a63
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment