行ロック - FOR SHARE Sesseion A | Session B |
======================================================================================================
=> BEGIN; SELECT * FROM t1 WHER | => | 1. FOR SHAREでSELECTすると、
E id = 1 FOR SHARE; | => | id=1な行がロックされるが、
id | n | => |
----+----- | => |
1 | 100 | => |
| => |
=*> | => BEGIN; SELECT * FROM t1 WHER | 2. 別のセッションからSELECTし
| E id = 1 FOR SHARE; | ても、ブロックされずにSELECTが
| id | n | 実行される
| ----+----- | もしAがFOR UPDATEでSELECTして
| 1 | 100 | いたら、BのSELECTはブロックされ
| | て、AがCOMMITするまでBは実行さ
| | れない
| |
| =*> UPDATE t1 SET n = 1 WHERE i | 3. ただし、ブロックされないのは
| d = 1; | SELECTだけで、UPDATEとDELETEは
| | ブロックされる
| |
| |
参考http://shiroyasha.io/selecting-for-share-and-update-in-postgresql.html |
|