↑の記事にてInnoDBのロックについてまとめましたが、公式ドキュメントを読み漁る中で「locking read」と「non-locking read」という言い回しがあり、気になったのでまとめてみました。
MySQL :: MySQL 8.0 Reference Manual :: 15.7.2.4 Locking Reads
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から最新の値を取得するという特徴からファントムリードが発生し得る。
- 処理内容によってはデッドロックが発生する。
参考
漢(オトコ)のコンピュータ道: InnoDBのREPEATABLE READにおけるLocking Readについての注意点
主要RDBMS製品の比較 – 同時実行制御, トランザクション分離レベル | コーソルDatabaseエンジニアのBlog
MySQL の Repeatable Read と RocksDB の楽観的トランザクション解説|技術ブログ|北海道札幌市・宮城県仙台市のVR・ゲーム・システム開発 インフィニットループ