ロック

EXCLUSIVE MODE

1. taroがロックを掛けて、INSERTを実行

 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; taro=# SELECT * FROM t1;

  num
 -----
    1
    2
    3
 (3 行)

この時点でまだCOMMITしない。

2. hanaがINSERTを実行

 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を実行

 taro=# COMMIT;

このCOMMITにより、2.のINSERTのブロックが解除される。

 taro=# SELECT * FROM t1;
  num
 -----
    1
    2
    3
    4
 (4 行)

numの値"3"が1.の、"4"が2.のINSERTを反映している。

参考

http://www.postgresql.jp/document/current/html/sql-lock.html


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS