3.5同時実行制御(排他制御)

3.5同時実行制御(排他制御)

データベーススペシャリスト試験の教科書より、同時実行制御(排他制御)の基礎について学習した内容をまとめ。

同時実行制御

排他制御

ロックをかける対象を排他資源(データベース、表、ページ、レコード、行)という。

専有ロック、共有ロックなどのロックをかけて、並列実行されるトランザクションのスケジュールを直列実行可能なものにコントールすることを排他制御(exclusive control)という。通常、データベースをアクセスするトランザクションの同時実行制御には、排他制御が用いられる。

  • 直列化可能性を保証する2相ロック規約(2相ロック方式)
  • デッドロックが起こらないことも同時に保証する木規約

ロック対象の大きさ(ロックの粒度)

ロックを行う単位の大きさをロックの粒度(locak granularity)という。

  • ロックの粒度を細かくした場合、多重度は上がる、DBMS側のオーバーヘッドは増大
  • ロックの粒度を大きくした場合、多重度は下がる、オーダーヘッドは少なく効率が良い

ロックの種類

  • 専有ロック(exclusive lock)
  • 共有ロック(shared lock)
  • 両立性
T1/T2ロックなし共有ロック専有ロック
ロックなし
共有ロック×
専有ロック××
ロック両立性

述語ロック

ページ、表などに対するロックを物理ロックという。不当な更新を許してしまう欠点がある。この問題を避けるためのロックの方法が述語ロック(predicate lock)。

ロック制御

ロック制御は個々のトランザクションがロックに関する一定の規約を準することによって直接化可能性を保証する。

2相ロック方式

排他資源に一斉にロック(第一相目)、操作の後にロックを一斉に解除(第2相目)その後、二度とロックをかけないロックの方式

木規約

データに順序を付けて、その順番どおりにロックをかけていく方式

デッドロック

2相ロック方式ではデッドロック(dead lock)が発生する可能性がある。

デッドロックに対処する方法には、デッドロックが起こらないように資源割り当てを固定化する静的防止(予防法)、資源割り当てを制御する動的防止(回避法)、デッドロックが発生した際に初めてそれを除去する検知除去法がある。

静的防止法

木規約を用いる

動的防止法

時刻印を用いた待ちー死に(wait-die)あるいは傷着けー待ち(wound wait)という方式を用いてデッドロックが発生しないように制御する。

検知除去法

もっとも一般的な手法。待ちグラフ。

時間監視による方法

待ちグラフ(WFG:Wait For Graph)

一貫性水準

トランザクションの隔離性(直列化可能性)を保証、トランザクションの並列実行性(多重度)を上げることはトレードオフ。

一貫性水準(consistency level)はこの規約を守る機会を示す。

隔離性水準

SQL-92はトランザクション処理の機能拡張を行う、SET TRANSACTION 文で隔離性水準(ISOLATION LEVEL)を追加。

隔離性水準/現象ダーティリードノンリピータブルリードファントムリード
READ UNCOMMITTED発生する発生する発生する
READ COMMITTED発生しない発生する発生する
REPEATABLE READ発生しない発生しない発生する
SERIALIZABLE発生しない発生しない発生しない
SQL-92の隔離性水準

一貫性水準と隔離性水準の関係

ダーティライト(Dirty write)

ほかのトランザクションがコミットあるいはロールバックを行う前にデータの書き込みを行う(汚染sる)。

ダーティリード(Dirty read)

T1がコミットしないで一時的に汚染したデータをT2が読み込む

ノンリピータブルリード(Noon-repeatable read)

T1が再読み込みするとT2によって更新または削除された行を読み込む

ファントム(Phantom)

T1がある探索条件にしたがって再読み込みすると、T2によって追加された行を読み込む