- [[Serializability]] ([[Isolation]]) を実現するために使われる [[Locking protocol]]の一つ
- [[Conflict Serializable|Conflict Serializability]]を保証する
- [[Pessimistic Concurrency Control]]
- Read-Read以外は全部ブロックする
- [[Snapshot isolation]]と異なり、リーダーはライターをブロックする & ライターはリーダーもブロックする
# 仕組み
- 排他ロックを用いる
- Shared modeのロックと、Exclusive modeのロックがある
- Shared mode lock
- 複数のトランザクションが同時に取得できる
- 他のトランザクションがそのオブジェクトのExclusive mode lockを取得していたら、それを待たないと取れない
- Exclusive mode lock
- 排他ロックなので、同時に取得できるトランザクションは1つ
- Readするとき: まずShared modeのロックを取ってから読む
- Writeするとき: まずExclusive mode lockを取ってから書く
- ロックマネージャーは、データアイテム$Q$に対しモード$M$のロックを要求する$T_1$に対し、以下の条件を満たす場合のみロックを付与すると[[Starvation-freedom]]を達成できる
- $Q$について、モード$M$と競合するロックモードのロックが別のトランザクションに付与されていないかチェックする
- $Q$のロック待ちで、$T_1$より先にロックを要求したトランザクションが他にないかチェックする
- 以下2つのフェーズでトランザクションを構成する
- フェーズ1: Growing phase
- トランザクションはロックを獲得することができるが、解放することはできない
- Growing phaseの終了ポイントを[[lock point]]という。lock pointでトランザクションの順序付けができる。
- フェーズ2: Shrinking phase
- トランザクションはロックを解放することができるが、新しいロックを得ることができない
# 注意
- ロックを取得したトランザクションは、トランザクションCommit時(またはAbort時)まで保持し続けないといけない
- そのLockのアイテムへのアクセスが終わったら手放していいかというと、そうではない。異なるアイテム間の整合性が壊されることがあり、[[Serializability]]に違反する
- [[Phantom]]を発生させないため、lockは、オブジェクト単位だったり、[[predicate lock]]だったり、[[range lock]]だったり
- [[Deadlock]]が起こり得る