楽観排他制御と悲観排他制御とは
基本概念の定義
- 楽観排他制御
楽観排他制御はデータ競合の発生頻度が低いと仮定し、最初にデータのロックを取らずに操作を行い、競合が発生した場合にのみ対応する手法です - 悲観排他制御
悲観排他制御はデータ競合の発生頻度が高いと仮定し、最初にデータのロックを取得してから操作を行う方法です。これにより、データの一貫性を保証します
両者の違いと特徴
楽観排他制御
- 特徴:高速な読み取りが可能で、書き込み時にのみ競合検出を行います
- メリット:データやリソースの使用が高効率的であり、競合が少ない場合にパフォマンスは良いです
- デメリット:競合が多発する環境では、再試行が頻繁に発生し、パフォマンスが低下します
悲観排他制御
- 特徴:データの一貫性を重視し、操作する前にデータのロックを取得します
- メリット:競合が多い環境でも、データの整合性が保たれます
- デメリット:ロックによるリソースの占有が発生し、待機時間が長くなることがあります
日常生活における楽観排他制御と悲観排他制御の例
生活の中での具体的な例
- 楽観排他制御の例
- オンラインショップのカート:ECサイトでは、複数のユーザーが同じ商品をカートに追加しても、システムはすぐに在庫をロックしません。ユーザーが最終的に注文を確定するときに、システムは在庫が十分かどうかを確認します。在庫が不足している場合は、ユーザーに再選択または注文のキャンセルを促します。これは典型的な楽観排他制御
- 悲観排他制御の例
- 銀行の貸金庫:貸金庫を使う前に、必ずロック権限を取らなくてはいけない。使用中は他の人はアクセスできないようにします。これは典型的な悲観排他制御
楽観排他制御の技術的な詳細
楽観排他制御の基本原理
楽観排他制御は、トランザクションの開始時にデータのロックを取得せずに処理を行い、最終的にコミット時に競合が発生していないを確認します
バージョン管理と競合検出
各データ項目にバージョン番号を持たせ、トランザクションが開始ときにバージョン番号を記録します。コミット時に変更していない場合にのみコミットを成功させます。バージョンが変更されている場合、再試行が必要です
具体的な実装例
- データベース:SQLデータベースにおける MVCC(Multi-Version Concurrency Control)は、楽観排他制御の一例です。各トランザクションが開始時にスナップショットを取得し、競合検出を行います
悲観排他制御の技術的な詳細
悲観排他制御の基本原理
悲観排他制御は、トランザクションの開始時にデータのロックを取得し、操作が完了するまでロックを保持します。これにより、他のトランザクションが同じデータにアクセスできないようにします。
ロック機構とその管理
- 排他ロック(Exclusive Lock):データに対する完全なロックであり、他のトランザクションからの読み取りも禁止します
- 共有ロック(Shared Lock):データの読み取りを許可し、他のトランザクションが同時に読み取りを行うことができますが、書き込みは禁止します
具体的な実装例
- データベース:多くのSQLデータベースシステムが悲観排他制御を採用しており、トランザクションの開始時にロックを取得します
楽観排他制御と悲観排他制御の比較
利点と欠点
-
楽観排他制御:
- 利点:高いスループットを提供し、ロックのオーバーヘッドが少ない
- 欠点:競合が多発する場合、再試行が多くなり、パフォーマンスが低下する
-
悲観排他制御:
- 利点:データの整合性を確保し、競合が発生する環境で有効
- 欠点:ロックのオーバーヘッドが高く、リソースの競合が発生しやすい
適用シナリオと選択基準
- 楽観排他制御:競合が少ない環境、読み取りが多く書き込みが少ないシナリオに適しています
- 悲観排他制御:競合が多い環境、データの整合性が重要なシナリオに適しています。