カテゴリー別アーカイブ: しょうたん@hangout

postgresのロック

今日はpostgresのロックについて投稿します。
共有ロックと排他ロック、そして行ロックとテーブルロックの状況を整理する為の箇条書きです。

・行レベルロック
行が更新または削除されると自動的に獲得され、トランザクションがコミットまたはロールバックするまで保持されます。このロックは同じ行に対する書き込みのみをブロックします。行を変更せずに行に対して行レベルロックするには、SELECT FOR UPDATEを使います。

ROW SHARE
EXCLUSIVEおよびACCESS EXCLUSIVEロックモードと競合します。
SELECT FOR UPDATEコマンドでこのモードのロックを獲得します。

ROW EXCLUSIVE
SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、およびACCESS EXCLUSIVEロックモードと競合します。
UPDATE、DELETE、およびINSERTコマンドでこのモードのロックを獲得します。

・テーブルレベルロック
要はpostgresではSQLコマンドによって適用されるロックの種類が違っていて、それに競合するロックもそれぞれ異なります。
通常自動的にロックが獲得されますが、明示的に使用する事もできます。また、LOCK 構文で取得できるロックはテーブルに対するロックのみです。

ACCESS SHARE
ACCESS EXCLUSIVE ロックモードとのみ競合します。
SELECTとANALYZEコマンドにより、参照されるテーブルに対してこのモードのロックが獲得されます。
通常、テーブルの読み取りのみで変更を行なわない問い合わせであれば全て、このロックモードを獲得します。

SHARE UPDATE EXCLUSIVE
SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、およびACCESS EXCLUSIVEロックモードと競合します。
(FULL無しの)VACUUMコマンドでこのモードのロックを獲得する。

SHARE
ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE ROW EXCLUSIVE、EXCLUSIVE、およびACCESS EXCLUSIVEロックモードと競合します。
CREATE INDEXでこのモードのロックを獲得します。

SHARE ROW EXCLUSIVE
ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、およびACCESS EXCLUSIVEロックモードと競合します。
このロックモードを自動的に獲得するコマンドはありません。

EXCLUSIVE
ROW SHARE、ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、および ACCESS EXCLUSIVEロックモードと競合します。
このロックモードを自動的に獲得するコマンドはありません。

ACCESS EXCLUSIVE
全てのロックモード(ACCESS SHARE、ROW SHARE、ROW EXCLUSIVE、SHARE UPDATE EXCLUSIVE、SHARE、SHARE ROW EXCLUSIVE、EXCLUSIVE、およびACCESS EXCLUSIVE)と競合します。
ALTER TABLE、DROP TABLE、REINDEX、CLUSTERおよびVACUUM FULLコマンドによって獲得されます。 LOCK TABLE文のデフォルトのロックモード。

以上です、行レベルロックとテーブルロックの挙動を明確に把握しましょう。