PostgreSQLスキルアップノート(自己啓発のための個人サイト)
テーブルレベルロック・概要編
【一覧に戻る】
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ テーブルレベルロック・概要編
■■■■
■■■■
■■■■ 2013/03/03
■■■■ 使用環境:PostgreSQL9.1.7 (CentOS6.2)
(C) 2013 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
テーブルレベルのロックの種類、意味、それぞれの影響など。
【マニュアル】
第 13章同時実行制御・明示的ロック→●[マニュアル]
第13章同時実行制御・明示的なブロッキングロックを用いた一貫性の強化→●[マニュアル]
LOCK文→●[マニュアル]
SELECT文(FOR UPDATE/FOR SHARE句)→●[マニュアル]
第45章システムカタログ・pg_locks→●[マニュアル]
【その他】
−
【用語等】
LOCK文及びLCOK TABLE文
・双方は全く同じ意味。
・正式な呼称は「LOCK文」であるが、「LOCK TABLE」と呼ぶ場合が多い。
■1■ 概要
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1.明示的/暗黙的なロック
──────────────────────────────
テーブルレベルロックを行うケースは大別して2種類ある。
・明示的なテーブルレベルのロック・・・LOCK文(LOCK TABLE文)
・暗黙的なテーブルレベルのロック・・・テーブルアクセスのあるSQL文すべて
どんなSQL文でもテーブルアクセスなら必ずそのテーブルレベルのロックが暗黙的にかかる。
たとえSELECTであってもテーブルロックが行われる。
だからといって他からデータ更新ができなくなるということでは(必ずしも)ない。
それぞれに応じた最適な「ロックモード」が使われ、それにより影響範囲が変わってくる。
2.ロックモード
──────────────────────────────
ロックの緩い順
1) ACCESS SHARE
2) ROW SHARE
3) ROW EXCLUSIVE
4) SHARE UPDATE EXCLUSIVE
5) SHARE
6) SHARE ROW EXCLUSIVE
7) EXCLUSIVE
8) ACCESS EXCLUSIVE
・明示的にLOCK文で実行する場合は上記のすべてのモードを自分で指定することができる。
・暗黙的なテーブルロックの場合は、それぞれのSQL文に合わせた最適なモードでテーブル
ロックが自動的に実行される。(ただし上記のうちの一部は暗黙ロックには使われていない)
・モードにROWが入っているものもテーブルレベルロックであり行ロックではない。
■2■ LOCK文
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
以下マニュアルの構文を簡略化して記載。(以下は文法ではありません)
LOCK [TABLE] tablename [ IN ロックモード MODE ] [ NOWAIT ];
・LOCK〜 も LOCK TABLE〜 も同じ意味。動作に違いはない。
・指定できるロックモードは前項のモード(8種類)すべて可能。
・ロック取得できないとき、NOWAIT指定時はエラー、NOWAIT無しなら待ちとなる。
・tablenameはカンマ区切りで複数与えられる(lock t1,t2,t3,t4;)
・ロックモードは省略するともっとも強いACCESS EXCLUSIVEとなる。
・1を除いてテーブルレベルのUPDATE、DELETE、TRUNCATE権限が必要である。
・この他にONLY(子テーブルをロック対象に含めない)などあり。
■3■ ロックモード別影響範囲
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
マトリクスの見方
「要求ロックモード」を試みたが、既に別の誰かによって「現在のロックモード」欄
にあるロックがかかっていた場合 X印の部分が影響を受ける。
影響とは、ロック要求時の指定がNOWAITならエラー、NOWAITなしなら待ちとなる。
ただしLOCK文を使う場合はNOWAITか否かを指定で選べるが、暗黙でロックされる
場合は、NOWAITを指定できないケースが多い。
LOCK文以外ではNOWAITがあるのはSELECT FOR UPDATEなど一部に限られる。
--------------------------------------------------------------+-+-+-+-+-+-+-+-+
現在のロックモード
| | | | | | | | |
要求ロックモード LOCK文以外の代表例 |1|2|3|4|5|6|7|8|
| | | | | | | | |
--------------------------------------------------------------+-+-+-+-+-+-+-+-+
1 ACCESS SHARE SELECT | | | | | | | |X|
2 ROW SHARE SELECT FOR UPDATEおよびSHARE | | | | | | |X|X|
3 ROW EXCLUSIVE UPDATE,DELETE,INSERT | | | | |X|X|X|X|
4 SHARE UPDATE EXCLUSIVE VACUUM等 | | | |X|X|X|X|X|
5 SHARE CREATE INDEX | | |X|X| |X|X|X|
6 SHARE ROW EXCLUSIVE - | | |X|X|X|X|X|X|
7 EXCLUSIVE - | |X|X|X|X|X|X|X|
8 ACCESS EXCLUSIVE VACUUM FULL等 |X|X|X|X|X|X|X|X|
--------------------------------------------------------------+-+-+-+-+-+-+-+-+
■4■ その他参考
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
・ロック解除はトランザクション終了時。
明示的に解除するコマンドはない。
・テーブルレベルのロックは一部を除き、Oracleの構文との互換がある。
---マニュアル----------------------------------------------------------
ACCESS SHARE、ACCESS EXCLUSIVE、SHARE UPDATE EXCLUSIVEロックモードを除き、
PostgreSQLのロックモードとLOCK TABLE構文はOracleのものと互換性があります。
-----------------------------------------------------------------------
以上