トランザクション分離レベルまとめ

トランザクションとは、排他ロック・共有ロックを使って、資源に対する排他処理を行うことである。


トランザクションは、begin,commit,rollbackの操作によって構成されるが、
トランザクションをしたとしても、後述するように、排他処理がうまくいかないことがある。
そこで、分離レベルを設定することによって、排他ロック、共有ロックのかかりかたを変え、この問題に対処することができる。


MySQLInnoDBでは、デフォルトではREPEATABLE READというレベル3に相当する分離レベルである。
これは、スナップショットが有効であり、すなわち読み取り一貫性を保証することで、ファジーリードが発生しないレベルである。
ただし、複数トランザクションが同一テーブルに対し、範囲読み取りとレコード挿入を行った場合、
読みとりタイミングによって、ありえないはずのレコードが見える、あるいはレコードがずれて見えるファントムリードが発生する。


レベル1はUNCOMMITABLE READであり、これはコミット前のデータの読み取りができるいわゆるダーティリードが発生する。


レベル2はCOMMITABLE READであり、コミットを行うまで他プロセスからは途中データが読み取れないが、
複数トランザクションが同一レコードにたいし、一方のプロセスがコミット前後で読み取りをおこなっている場合に、
読み取りタイミングによって値が変わるファジーリードが起こる。


レベル4はSERIALIZABLEであり、すべての読み取りに共有ロックがかかる。
そのため、ファントムリードが発生しない。


注意したいのは、MySQLトランザクションは行レベルのロックということであって、
複数レコードをとりあつかう際のファントムリードをふせぐために明示的に共有ロックをかけるということをしたほうがよいということ。