クエリビルダは、SELECT文で「悲観的ロック」を行うための機能をいくつか持っています。SELECT文を実行する間「共有ロック」をかけたい場合は、sharedLockメソッドをクエリに指定して下さい。共有ロックはトランザクションがコミットされるまで、SELECTしている行が更新されることを防ぎます。
DB::table('users')
->where('votes', '>', 100)
->sharedLock()
->get();
もしくはlockForUpdateメソッドが使えます。占有ロックをかけることで、レコードを更新したりSELECTするために他の共有ロックが行われるのを防ぎます。
DB::table('users')
->where('votes', '>', 100)
->lockForUpdate()
->get();
ロックが掛かっている行に対する他からの操作
- | 共有ロック | 専有ロック |
---|---|---|
照会 | ○ | ✗ |
更新 | ✗ | ✗ |
共有ロック | ○ | ✗ |
専有ロック | ✗ | ✗ |