#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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS