行ロック - 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は
                                  |                                 |    ブロックされる
                                  |                                 | 
                                  |                                 | 
  • FOR UPDATEを緩くしたのがFOR SHARE
  • FOR UPDATEはあるトランザクションで行ロックされると、別のトランザクションからは一切アクセスできなくなる(ブロックされる)が、
  • FOR SHAREはSELECTだけなら別のトランザクションからブロックされずに実行できる

参考

http://shiroyasha.io/selecting-for-share-and-update-in-postgresql.html


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

Last-modified: 2021-06-17 (木) 15:51:09