排他制御(楽観的ロックと悲観的ロック)

もくじ

排他制御

DBを更新する時それを一人で使用していれば特に問題ありませんが、複数人で扱っていたら更新するタイミングがかぶってしまうことも想定しなければなりません。

用語 意味
楽観的ロック めったに同時更新は起きないだろうという楽観的な視点での排他制御
悲観的ロック 他者が同じデータに頻繁に変更を加えるだろうという悲観的な前提の排他制御

楽観的ロック

めったに同時更新は起きないだろうという楽観的な前提の排他制御

更新対象のデータがデータ取得時と同じ状態であることを確認してから更新することで、データの整合性を保証する方式です。

参照時には全くロックを掛けず、新しいリソースの挿入時に参照データとバージョンが同じか、参照から更新の間に誰かに変更されていないか、をチェックしてから挿入します。

楽観的ロックをするために、更新のバージョンを持たせます。更新されるとバージョンが上がるので、そのバージョンを照合して制御しています。

参照から更新の間に元データに変更があったら変更を破棄します。

悲観的ロック

他者が同じデータに頻繁に変更を加えるだろうという悲観的な前提の排他制御

更新対象のデータを取得する際にロックをかけることで、他のトランザクションから更新されないようにする方式です。

悲観的ロックでは、ロックの解放漏れがあるといつまで経っても他者が操作できなくなってしまうため、データ更新後はロックの解放を必ず行います。

またロックが解放されるまで、他者は待機時間を余儀なくされます。

参考URL

排他制御(楽観ロック・悲観ロック)の基礎 - Qiita