InnoDBのlocking read
↑の記事にてInnoDBのロックについてまとめましたが、公式ドキュメントを読み漁る中で「locking read」と「non-locking read」という言い回しがあり、気になったのでまとめてみました。
https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html
locking readとは
SELECT ... FOR SHARE, SELECT ... FOR UPDATE時のロックを伴う読み取り処理を指します。
locking readではconsistent read(一貫性読み取り)ではなく常にDBから最新の値を取得します。
non-locking readとは
locking readではない処理のことで通常のSELECTを指します。
InnoDBでは通常のSELECTはconsistent readを行います。consistent readではMVCC(※1)という仕組みによりスナップショットから値を参照しようとします。こちらでは他トランザクションによるレコード増減の影響を受けない為ファントムリード(※2)が起こりません。
- ※1: MultiVersion Concurrency Controlの略。トランザクション単位でバージョニングする機構。InnoDBでは読み取り時にMVCCが保持するバージョンのスナップショットを参照することでconsistent readが実現されています。
- ※2: ファントムリードとは、あるトランザクションT1で複数回読み取りをした際、同タイミングに別トランザクションT2でレコードの追加/削除を実施したことにより、T1の読み取り結果が変わってしまうような現象を指します。
メリット
- 他のトランザクションからの更新処理をロックする為、Lost Updateを防ぐことができる。
- 読み取り実行時点での正確な最新値が得られる。
デメリット
- 常にDBから最新の値を取得するという特徴からファントムリードが発生し得る。
- 処理内容によってはデッドロックが発生する。
参考
https://nippondanji.blogspot.com/2013/12/innodbrepeatable-readlocking-read.html
https://cosol.jp/techdb/2022/09/rdbms_compare_conc_cntl_transaction/