[InterDB] [著者HP] [PREVIOUS][UP][NEXT]

Copyright @ 2009, Suzuki Hironobu @ InterDB


■2-08■ ロックとは



ロックモード

ロックにはテーブル単位でロックを行う“テーブルロック(table lock)”と行ごとロックを制御する“行ロック(row lock)”があります。PostgresSQLは双方をサポートしています。【表.2-3】にPostgresSQLの8つのロックモードを示します(補足 1)。

UPDATE, DELETE, INSERT
表.2-3 ロックモード
ロックモード 説明 自動獲得
ACCESS SHARE 最も制限の弱いロックモード。ACCESS EXCLUSIVEとのみ競合(Conflict) SELECT
ROW SHARE 個々の行について共有ロックをかける "SELECT FOR UPDATE"
ROW EXCLUSIVE 特定の行の更新に関してのみ排他ロックを行なう
SHARE UPDATE EXCLUSIVE スキーマの変更と、VACUUM文の同時実行からテーブルを保護 VACUUM
SHARE テーブル全体に対し共有ロックをかける "CREATE INDEX"
SHARE ROW EXCLUSIVE 同時1個のトランザクションのみ取得可能。全ての同時"SELECT...FOR UPDATE"文をブロックする。
EXCLUSIVE 排他ロックをかける
ACCESS EXCLUSIVE 最も制限の強いロックモード。同時に起こる全ての操作からテーブルを保護。 "ALTER TABLE"、"DROP TABLE"、"VACUUM FULL"、"LOCK TABLE"

PostgreSQLはMVCCを採用しているため、READロックとWRITEロックが競合しません。

デッドロックの回避

デッドロックとは、複数のロックが互いに相手のロック解除を待って、処理が停止してしまう状態のことです。
PostgreSQLにはデッドロック状態にあるか否かを検出する機構があり、万が一デッドロック状態に陥っても、関連するトランザクションをアボートすることでデッドロック状態から脱出します。
ただし、デッドロック検出処理は非常に負荷が大きいので、実行時パラメータ“deadlock_timeout”に設定された時間はロック待ちして、デッドロック検出を頻繁に行わないようにします。


補足

【表.2-3】の右欄『自動獲得』には、実行時に左欄のロックモードをかけるSQL文が記述されています。例えば、SELECT文は実行時にACCESS SHAREロックモードをかけます。

[PREVIOUS][UP][NEXT]