(前提知識:InnoDBのロックに関する用語の確認で書いた用語を使っているのでさらっと読んでおくとわかりやすいと思う)
おさらい
トランザクション分離レベルを実現するために、MySQLは以下の方法を組み合わせている。
- 読み取り/書き込みについて、ロックを使って待機させたりエラーにしたりして制御する方法
- 読み取りについて、MVCCを使って前のバージョンを読み取る方法
また、MySQLでの読み取り/書き込み操作には以下の種類がある。
- 書き込み(
UPDATE
、DELETE
、INSERT
) - 読み取り
-
SELECT ...
(ロックを明示しない読み取り) -
SELECT ... LOCK IN SHARE MODE
(共有ロックを明示した読み取り) -
SELECT ... FOR UPDATE
(排他ロックを明示した読み取り)
-
予測
検証の前に、予測を立てた。
- 予測① 書き込みは、どの分離レベルでも同様に排他ロックを取得する
- 予測② ロックを明示した読み取りは、どの分離レベルでも同様に明示された通りのロックを取得する
- 予測③ 読み取り時にロックを取得する場合は、最新のデータを読む(過去のバージョンのデータをロックすることはできないから)
- 予測④ ロックを明示しない読み取りの動作は、分離レベルによって異なる
- 最新の値を読み取る場合/前のバージョンを読み取る場合/ロックを取得する場合
- どの分離レベルでどの動作かは長くなるので別ページにまとめる予定
検証手順、詳細な予測および結果へのリンク
検証項目が多く、書いていたらあまりにも長くなったので、ページを分けた。書き次第リンクをつなげていく。
- 予測①書き込み
- 予測②と③ロックを明示した読み取りの検証手順
- 予測④ロックを明示しない読み取りの検証手順