トランザクション分離レベル
今回はトランザクション分離レベルについて書いてみます。
先輩に知っておくと良いかもねと言われてちょっと調べてみました。
トランザクションについては前の記事に書いているので今回は割愛していきます。
ACID特性
ACIDとは、信頼性のあるシステムの持つべき性質をまとめたものです。
ACIDはAtomicity(原子性)、Consistency(一貫性)、Isolation(独立性)、Durability(永続性)から成ります。
・Atomicity(原子性)
トランザクション内で実行される全ての処理は、全体として実行されるのか、実行されないのかのどちらかであることが保証される性質。途中で処理が失敗した場合は、トランザクション前の状態を維持する。
・Consistency(一貫性)
トランザクション実行前と実行後でデータに矛盾がなく整合性が保たれ、指定のルールに沿った形で処理が行われているという性質。
・Isolation(独立性)
トランザクションの実行中のデータは外部から見ることはできず、見ることのできるのは処理の実行前と実行後のデータだけであり、トランザクション中に行われる操作は他のトランザクションに影響を与えないという性質。
・Durability(永続性)
あるトランザクションの処理が完了した段階で、その結果は永続的に失われることのないものとしてデータベースに記録されるという性質。
分離レベル
ANS/ISO SQL 標準で定められている分離レベルは、下記の4種類で定義されています。
・SERIALIZABL(直列化可能)
複数の並行に動作するトランザクションそれぞれの結果が、いかなる場合でも、それらのトランザクションを時間的重なりなく逐次実行した場合と同様の結果になる。このような性質を直列化可能性といい、SERIALIZABLEは最も強い分離レベルであり、もっとも安全にデータを操作できるが、相対的に性能は低い。ただし同じ結果とされる逐次実行の順はトランザクション処理のレベルでは保証されない。
・REPEATABLE READ(読み取り対象のデータを常に読み取る)
一つのトランザクションが実行中の間、読み取り対象のデータが途中で他のトランザクションによって変更される心配はない。同じトランザクション中では同じデータは何度読み取りしても毎回同じ値を読むことができる。
ただしファントム・リードと呼ばれる現象が発生する可能性がある。ファントム・リードでは、並行して動作する他のトランザクションが追加したり削除したデータが途中で見えてしまうため、処理の結果が変わってしまう。
・READ COMMITTED(確定した最新データを常に読み取る)
他のトランザクションによる更新については、常にコミット済みのデータを読み取る。MVCCはREAD COMMITTEDの実現する実装の一つである。
ファントム・リードに加え、非再現リードと呼ばれる、同じトランザクション中でも同じデータを読み込むたびに値が変わってしまう現象が発生する可能性がある。
・READ UNCOMMITTED(確定していないデータまで読み取る)
他の処理によって行われている、書きかけのデータまで読み取る。PHANTOM、NON-REPEATABLE READ、さらにダーティ・リードと呼ばれる現象(不完全なデータや、計算途中のデータを読み取ってしまう動作)が発生する。トランザクションの並行動作によってデータを破壊する可能性は高いが、その分性能は高い。
起こりうる問題
独立性や一貫性が不足するときに起こりうる問題として以下のようなものがあります。
分離レベルの理解をするためにはこれらも知っておかないといけません。
トランザクションAとトランザクションBが同時に一つのテーブルを操作操作するとします。
・ダーティーリード
トランザクションAを実行中に、トランザクションBによって更新された未コミットのデータを、トランザクションAの方で読み取ってしまう現象。
・ファジーリード/ノンリピータブルリード
トランザクションAでデータを呼び出した後に、トランザクションBによって同じデータを更新または削除のコミットを行い、再度同じデータをトランザクションAで呼び出した時に、1度目の結果とは異なるデータを読み取ってしまう現象。
・ファントムリード
トランザクションAで一定範囲のレコードを読み取ったあと、トランザクションBによるレコードの挿入または更新のコミットを行い、トランザクションAで再度読み込みをした時に処理の結果が変わってしまう現象。
トランザクション分離レベル
上記の問題をどの程度許容するかがトランザクション分離レベルです。
デフォルトのトランザクション分離レベル
・MySQL(InnoDB) ... REPEATABLE READ
・PostgreSQL ... READ COMMITTED
・Oracle ... READ COMMITTED
・SQL Server ... READ COMMITTED
今回はトランザクション分離レベルについて書いてみました。
結構知らずに使用していたトランザクションだったが、こういった部分を意識して使ってみるとまた見えない部分が見えてくる気がするので覚えておきたい。
この記事が気に入ったらサポートをしてみませんか?