* ロック [#f0914eab]

** EXCLUSIVE MODE [#g05ea68c]
*** 1. taroがロックを掛けて、INSERTを実行 [#c50f98a2]
 taro=# SELECT * FROM t1;
  num
 -----
    1
    2
 (2 行)

 taro=# BEGIN; LOCK TABLE t1 IN EXCLUSIVE MODE;
ロックを実行する。
 taro=# INSERT INTO t1 ( num ) SELECT MAX(num) + 1 FROM t1;
INSERTを実行する。
 taro=# SELECT * FROM t1;
  num
 -----
    1
    2
    3
 (3 行)
この時点でまだCOMMITしない。

** 2. hanaがINSERTを実行 [#b53a85fb]
 hana=# SELECT * FROM t1;
  num
 -----
    1
    2
 (2 行)
SELECTは実行できるが、結果には1.のINSERTは反映されてない。

 hana=# INSERT INTO t1 ( num ) SELECT MAX(num) + 1 FROM t1;
このINSERTはブロックされる。

*** 3. taroがCOMMITを実行 [#wc9a09ec]
 taro=# COMMIT;
このCOMMITにより、2.のINSERTのブロックが解除される。

 taro=# SELECT * FROM t1;
  num
 -----
    1
    2
    3
    4
 (4 行)
numの値"3"が1.の、"4"が2.のINSERTを反映している。


** 参考 [#jd7b3f6a]
http://www.postgresql.jp/document/current/html/sql-lock.html
- http://www.postgresql.jp/document/current/html/sql-lock.html
- http://www.postgresql.jp/document/current/html/explicit-locking.html

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS