Last active
July 20, 2019 04:35
-
-
Save kyuma-git/093ac7c801df92a735e27b125112237a to your computer and use it in GitHub Desktop.
ActiveRecord::Base.transactionについて
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
◎ 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