#author("2021-06-17T15:49:17+09:00","default:ryuichi","ryuichi")
#author("2021-06-17T15:51:09+09:00","default:ryuichi","ryuichi")
* 行ロック - FOR SHARE [#k80128fb]
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は
| | ブロックされる
| |
| |
- FOR UPDATEを緩くしたのがFOR SHARE
- FOR UPDATEはあるトランザクションで行ロックされると、別のトランザクションからは一切アクセスできなくなる(ブロックされる)が、
- FOR SHAREはSELECTだけなら別のトランザクションからブロックされずに実行できる
** 参考 [#v2895eda]
http://shiroyasha.io/selecting-for-share-and-update-in-postgresql.html