* ロック [#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