楽観ロックと悲観ロックは、排他制御の代表的な方式です。今回はこの楽観ロックと悲観ロックについて紹介します。
楽観ロックと悲観ロックについて
排他制御とは
排他制御とは、共有資源に対して同時にアクセスした際に不整合が起きないよう動作を制御することをいいます。例として、ショッピングサイトの商品(共有資源)を2人のユーザーが同時に購入するケースを考えてみます。商品の残数が10と表示された状態で、2人が同時に1つずつ購入したとします。排他制御が行われていない場合、1人分の結果のみがショッピングサイトに反映されるため商品の残数が9となり、実態と合わない状態になってしまします。
楽観ロックとは
楽観ロックとは、他者との「同時更新はあまり起きない」という楽観的な考え方の排他制御です。更新対象データをロックすることはせず、更新対象のデータがデータ取得時と同じ状態であることを確認してから更新することで、データの整合性を保証する方式です。そのため、楽観ロックを使用する場合は、データの更新有無を判断するためのVersion管理が必要となります。
悲観ロックとは
楽観ロックとは、他者との「同時更新が頻繁に起きる」という悲観的な考え方の排他制御です。更新対象データを取得時にロックすることで、他者が操作できないようにすることで、データの整合性を保証する方式です。悲観ロックでは、ロックの解放漏れがあると、他者が操作できない状態が続いてしまうため、データ更新後のロック解放が必要となります。
例題
下記はそれぞれ、楽観ロックと悲観ロックのどちらか
- 同じ業務を複数人で実施する場合
- 業務実施に長時間を要する場合
- 他者との同時更新が発生した際に、簡易的にやり直しが可能な場合
回答
1、2 悲観ロック
3 楽観ロック
エンジニアからのアドバイス
排他制御している時間の長さはシステムの利便性の低下につながってしまいます。不都合や不整合が発生しない範囲で可能な限り短くするように心がけましょう。
