質問: 現在RubyonRailsを用いた排他制御について学びたいと考えております。 まずRailsを用いた排他制御には以下2種類がある認識です。(ほとんど概要ですがご容赦ください) ###### 悲観ロック * 「競合が起きるだろう」という前提 * モデルのlockメソッドを使用する ###### 楽観ロック * 「競合は多分起きないだろう」という前提 * テーブルにlock_versionカラムを追加 ただ、RubyonRailsには`ActiveRecord::Base.transaction`というメソッドがあり 基本的には排他制御はこちらで足りるのではないかという認識です。 私の理解が間違っていましたら申し訳ないのですが、 `ActiveRecord::Base.transaction`を使用するだけでは足りない場合が存在するのでしょうか? また、わざわざ上述したような実装 (モデルのlockメソッドを使用する、だったりテーブルにlock_versionカラムを追加したり、という実装です) をしなければいけない場合ってどんな場合が該当するのでしょうか?
回答: 複数のテーブルに対する処理が無いなら、トランザクション制御は不要で、エラー対処だけで済みます。 トランザクション制御を行うのは、整合性担保を簡単にするロールバックがあるからです。 トランザクション制御を行っても、デッドロックする要素があるなら、ロックによる排他制御が必要になります。