エンジニアのはしがき

プログラミングの日々の知見を書き連ねているブログです

InnoDBのlocking read

tm-progapp.hatenablog.com

↑の記事にて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・ゲーム・システム開発 インフィニットループ