👌
InnoDBのREPEATABLE READにおけるLocking Readについての注意点について
上記のブログで理解しにくかったところ、補足で情報が欲しかったことをまとめます。
トランザクション分離レベルの確認方法
SELECT @@GLOBAL.transaction_isolation, @@SESSION.transaction_isolation;
mysql5.7.20より前
SELECT @@GLOBAL.tx_isolation, @@SESSION.tx_isolation;
※分離レベルはREPEATABLE READ
がデフォルト
Lost Update
分離レベルがSERIALIZABLE
の場合以外発生する
ファントムリード
InnoDBで分離レベルがREPEATABLE READ
のとき
-
SELECTを使う場合
- Non-Locking Readの場合ファントムリードはおきない。
- Locking Read(SELECT ... FOR UPDATE)の場合はファントムリードがおきる。
ブログの問題点:100% 一貫性読み取りではない
の下の具体例を参照
-
UPDATEやDELETEの場合は
- デフォルトでLocking Readの挙動となる
- ファントムリードで取得した値に対して更新処理、削除処理が走る。(Non-Locking Readで読み取った場合は存在しなかった行に対しても処理が実行される。)
なのでNon-Locking Readで値を確認後に更新すると意図しない結果になることがあるかもしれない。なので事前にSELECT ... FOR UPDATEしたほうが安全
Discussion