ロックの粒度
ロックの粒度とは、ロックの対象となるデータの単位の事。具体的には、(行、ページ、テーブル、データベース )などの大きさで指定が可能。
例えば、ロックの粒度が行ならばトランザクションは同時に同じテーブルにアクセス可能可能である。その為、トランザクション間の待ち時間が短くなる為スループットは向上する。それとは別にロックの粒度がテーブルの場合、同じテーブルにアクセスするしようとする別のトランザクションは、テーブルに対するロックが解除されるまで待ち時間が発生することになる為スループットが低下する。
ロックの粒度が大きくなるにつれて、ロックの制御は容易になるが、ロックの待ち時間が長くなる。
一方ロックの粒度が小さくなるにつれて、ロックの待ち時間は短縮できるがロックの制御処理が複雑になる。
ロックの種類
ロックの名称 | 説明 |
---|---|
共有ロック | トランザクションが行を読み出す(参照する)時に、このロックをかける。SQLではSELECT文が動いた時。このロックがかかった場合、他のトランザクションは、共有ロックはかけられるが専有ロックはかけられない。 |
専有ロック | トランザクションが行を更新、SQLではINSERT,UPDATE,DELETEが動いた時にこのロックがかけられる。このロックがかけられた場合、他のトランザクションはロック(共有、専有ともに)かけることができない。 |
2相ロッキングプロトコル(2PL(Two Phase Locking))
排他制御方式の1つ(もう一つは木規約)の事。トランザクションの実行前段階で読み込み・書き込みを行う共有資源に対してロックをかけておいて(第1相)、処理終了後にロックを解除する(第2相)と言うもの。
2PLの実装がなされているのは、ISOLATION LEVELがREPEATABLE READとSERIALIZABLEに設定されている時。
ISOLATION LEVELがREAD COMMITTEDの場合は2PLに準拠していない為、ロックをかける順番を人工的に指定してあげないとデッドロックが起こる可能性が高まる(2PLに準拠指定てもデッドロックは発生する)。
以下具体例↓
共有資源(a,b)が存在していると仮定した場合。
(2相ロック準拠Ver)
TR1
LOCK a
READ a
a = a + 3
WRITE a
LOCK b
READ b
b = b + 3
WRITE b
UNLOCK b
UNLOCK a
TR2
LOCK a
READ a
LOCK b
READ b
UNLOCK b
UNLOCK a
↑上記の場合、TR1→TR2かTR2→TR1の順序でしかスケジューリングすることができない。この為、直列実行可能性を保証することが可能。
(2相ロック非準拠Ver)
TR1
LOCK a
READ a
a = a + 3
WRITE a
UNLOCK a
LOCK b
READ b
b = b + 3
WRITE b
UNLOCK b
TR2
LOCK a
READ a
LOCK b
READ b
UNLOCK b
UNLOCK a
↑上記の手順で各トランザクションを実行した場合、処理の途中でアンロックをする為T1→T2→T1のスケジューリングが可能であり、直列可能性を保証できない。
※2PLに準拠した場合、TR1→TR2もしくはTR2→TR1の実行スケジューリングとなる。※