行ロック - FOR SHARESesseion 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 |
|