5分で覚えるトランザクション分離レベル
これはなに
ども、レバテック開発部のもりたです。
今回はトランザクション分離レベルについてまとめました。トランザクション分離レベルって基本情報技術者試験とかで学ぶものの、座学だけだとあんまりピンとこずに忘れちゃいますよね。もりたも長らく曖昧な状態で生きていたのですが、よい理解の仕方があったので今回はその解説をします。
トランザクション分離レベルを構成するふたつの変数
トランザクション分離レベルとは
まず初めに、概要を掴むところからいきましょう。
トランザクション分離レベルとは、あるトランザクションのデータベースに加えた変更が、他のトランザクションにどの程度影響を与えるか? というもの(分離性、独立性)を一定基準でレベルに分けてまとめたものです。
どの程度影響を受けるか? については三つの影響が定義され、その影響度合いに応じて分離レベルが4つ存在します。これは大体こんな図で解説されます。
よくある画像
コミット前後、処理内容の四象限
そして、この発生する影響は以下ふたつの要素の組み合わせです。
- コミットの前/後
- コミットした前が見えるか、コミットした後が見えるか
- 更新処理/挿入削除処理
- UPDATEの処理が見えるか、INSERT, DELETEの処理が見えるか
図にすると、こんな感じです。
今回はこの図を使って、ひとつひとつのトランザクション分離レベルの説明をします。よくこの図を覚えといてください。
四象限とトランザクション分離レベル
説明
さて、ここから個々のトランザクション分離レベルについて、具体的に説明します。先ほどの図に分離レベルを書き込んだものを先に示します。
これが全てです。コミット前の処理が見える(ダーティリード)のがRead Uncommitedで、コミット後のUPDATEが見える(ファジーリード)のがRead Commited、コミット後のINSERT/DELETEが見える(ファントムリード)のがRepeatable Readです。また冒頭の図の通り、それぞれの分離レベルはより厳しいレベルで発生する影響を含みます。[1]
なおSerializableが載っていませんが、どれも見えません。
Read Uncommited
コミット前のUPDATE/INSERT/DELETEが見えます。この不都合をダーティリードと呼びます。フォームから入力されて更新が確定していないデータのことをダーティと呼んだりするので馴染みはあるかなと思います。
他の解説記事だと更新が対象と書いてあることが多いのですが、トランザクション分離レベルが策定されたSQL92での定義だと特に処理内容の言及はなく、INSERT/DELETEを含むようです。MySQLで実際に試しても、Read UncommitedでINSERTが確認できました。
Read Commited
コミット後のUPDATEが見えます。これをファジーリードだとか、ノンリピータブルリードと呼びます。
Repeatable Read
コミット後のINSERT/DELETEが見えます。これをファントムリードと呼びます。
このトランザクション分離レベルがRepeatable Readなのは、一度読み込んだ対象行がもう一度読み込んでも同じ結果を返すため、リピート可能と言っています。
なお、MySQLのInnoDBではこの分離レベルがデフォルトです。かつ、ネクストキーロックという仕組みでファントムリードを防いでいます。
Serializable
トランザクションが直列し、並行しない分離レベルです。並行しないので、同時実行した他のトランザクションの処理は見えません(というか存在しない)。この場合はファントムリードも発生しません。
最後に
以上で簡単な説明は終わりです。
簡単な説明でしたがトランザクション分離レベルと不都合を対応させやすくなっていたら幸いです。
参考文献
-
この箇所、こばさんからのご指摘をいただきました。ありがとうございます!! ↩︎
Discussion
こちらの図ですが、下半分を起きる事象(濃い色)とするのが正しいのではないでしょうか。
Read Committedは、冒頭の「よくある画像」にあるようにファジーリードもファントムリードも発生します。
ご指摘ありがとうございます!!!! Xの方でも返してしまったのですが、ご認識の通りです。
今回の記事はある程度知識のある人がサッと覚えられるよう、各トランザクション分離レベルとその分離レベルでギリ残っている影響との対応関係に焦点を当てています。
ただこばさんのご指摘の通り、この記事でトランザクション分離レベルに触れた人には誤解させる良くない記述なので、文章で補足させていただきます。ご指摘ありがとうございました!!
(関係ないですがこばさんが共著で参加された『マルチクラウドデータベースの教科書』も買わせていただきました!!!!!)
多分これ構成を変えたら色を塗る範囲を正しくしつつ伝わりやすい感じにできると思うので、今は一旦文章で補足しつつ後ほど修正させていただきます!