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のものと互換性があります。
  -----------------------------------------------------------------------



                                                                                                            
以上 
inserted by FC2 system