CMU Database Systems をひたすら追っていく ~17 Two-Phase Locking~
この記事は「けんつの1人 DBMS アドベントカレンダー Advent Calendar 2019 - Adventar」 21 日目の記事です。
はじめに
今日は Two-Phase Locking について。
Transaction Locks
ラッチというのは以前にも何度か解説していると思うがこれからはロックの話。
ロックには2つ種類がある。
- 共有ロック:複数のトランザクションが同じデータを読み取ることができるロック。トランザクションが共有ロックを取っている間に他のトランザクションが共有ロックを同じデータに対して取ることができる。
- 排他ロック:トランザクションがデータを変更するときにかけるロック。このロックは重複してかけることができず、同時に1つのトランザクションのみ排他ロックを取ることができる。
またトランザクションは以下のようにロックマネージャーを用いて実行・管理される。
Two Phase Locking
Two Phase Locking (2PL) は悲観的な同時実行制御プロトコルであり、トランザクションがその場でDB内のオブジェクトにアクセスできるかどうかを決定する。
トランザクションが競合した場合は、2PL で十分に対応できる。しかし、トランザクションが ABORT し、他のトランザクションをロールバックする必要がある場合は無駄な処理が生まれる。
以下の手順を具体的にはとる。
Phase1: Growing
- 各トランザクションはロックマネージャから必要なロックを要求する
- ロックマネージャはロック要求を許可または拒否する。
2PL Deadlock Handling
Two-Phase Locking ではデッドロックを解消するために検出する場合と防止する2つの方法がある。
おわりに
次は MVCC