👌

InnoDBのREPEATABLE READにおけるLocking Readについての注意点について

2022/02/08に公開

http://nippondanji.blogspot.com/2013/12/innodbrepeatable-readlocking-read.html

上記のブログで理解しにくかったところ、補足で情報が欲しかったことをまとめます。


トランザクション分離レベルの確認方法

SELECT @@GLOBAL.transaction_isolation, @@SESSION.transaction_isolation;

mysql5.7.20より前

SELECT @@GLOBAL.tx_isolation, @@SESSION.tx_isolation;

https://dev.mysql.com/doc/refman/8.0/ja/set-transaction.html

※分離レベルはREPEATABLE READがデフォルト

Lost Update

分離レベルがSERIALIZABLEの場合以外発生する

ファントムリード

InnoDBで分離レベルがREPEATABLE READのとき

  1. SELECTを使う場合

    • Non-Locking Readの場合ファントムリードはおきない。
    • Locking Read(SELECT ... FOR UPDATE)の場合はファントムリードがおきる。
      ブログの 問題点:100% 一貫性読み取りではないの下の具体例を参照
  2. UPDATEやDELETEの場合は

    • デフォルトでLocking Readの挙動となる
    • ファントムリードで取得した値に対して更新処理、削除処理が走る。(Non-Locking Readで読み取った場合は存在しなかった行に対しても処理が実行される。)
      なのでNon-Locking Readで値を確認後に更新すると意図しない結果になることがあるかもしれない。なので事前にSELECT ... FOR UPDATEしたほうが安全

https://dev.mysql.com/doc/refman/8.0/en/glossary.html#glos_exclusive_lock

Discussion