トランザクション分離レベルについて
トランザクションとは
①トランザクション
データの分割不可能な処理の単位を指す言葉です。
②トランザクション処理
金融機関のコンピュータシステムにおける入出金処理のような一連の操作を全体として一つの処理として管理することを「トランザクション処理」といいます。
「トランザクション処理」(複数の処理をまとめた一連の操作)は「すべて成功」か「すべて失敗」で終了する必要があります。
例:口座から口座へ資金を移動する際に、出金と入金を個別に処理すると「片方の口座から出金後、もう一方の口座への入金がエラーで失敗」した時、出金した分の資金が消失してしまいます。
上記の様な事象を回避するため、トランザクション処理ではすべての処理が完了するまで結果を確定させません。
途中のどこかで失敗したらそれ以前の処理もすべて取り消すという処理を行います。
上記の例では、入金が失敗したら出金処理の取り消し操作を行い、処理が始まる前の状態に戻して終了とする処理が行われます。
③ACID特性
DBのデータを操作する際にデータに不整合が起きないようにするための特性を指します。
1⃣原子性(Atomicity)
トランザクションが「すべて実行された状態」か、「全く実行されていない状態」かしかとらない性質のことを指します。
2⃣一貫性(Consistency)
実行後も整合性が取れる性質のことを指し、DBのトランザクションにおいては、DBのルールはどんなトランザクションが起こっても破られません。
3⃣独立性(Isolation)
複数の同時に実行されたトランザクションは、お互いに干渉しない性質を持ちます。
4⃣永続性(Durability)
トランザクションがコミットされたら、いかなる障害が発生してもコミットされた状態であることを保証する性質のことを指します。
トランザクション分離レベルとは
トランザクション分離レベル
複数のトランザクションが同時に実行される場合に、それらのトランザクションの間でどの程度の隔離性を保つかを制御するための概念を指します。
トランザクション分離レベルの段階
分離レベルは大きく4つに分けられており、高い順から
1⃣ SERIALIZABLE(直列化可能)
2⃣ REPEATABLE READ(繰り返し読み取り)
3⃣ READ COMMITED(確定読み取り)
4⃣ READ UNCOMMITED(未確定読み取り)
となります。
1⃣ SERIALIZABLE(直列化可能)
最も独立性(安全性)が高い分離レベルです。
トランザクションを順番に実行(直列化)するのと同じように、他のトランザクションのデータ更新の影響をまったく受けません。
また、アクセスが競合すると「先客」のトランザクションの終了を待たなければならないためパフォーマンスは最も低くなります。
2⃣ REPEATABLE READ(繰り返し読み取り)
2番目に独立性が高い分離レベルです。
他のトランザクションによるデータ更新の影響を受けず、トランザクション実行中は何度繰り返し対象データを読み取っても同じ値が返ってきます。しかし、他のトランザクションによるレコードの追加・削除の影響は受けるため、「ファントムリード」と呼ばれる現象が生じることがあります。
※ファントムリードとは、データベースシステムのトランザクション処理において、あるトランザクションが読み出しを複数回行うと、その間に他のトランザクションが追加したデータが増えてしまうこと。
3⃣ READ COMMITED(確定読み取り)
3番目に独立性が高い分離レベルです。
トランザクション実行中に他のトランザクションがコミットした変更の影響を受けます。
ファントムリードに加え「ノンリピータブルリード」現象が生じることがあります。
※ノンリピータブルリードとは、データベースシステムのトランザクション処理において、あるトランザクションが同じレコードを何度も繰り返し読み出す場合に途中で他のトランザクションが内容を更新してしまうこと。
4⃣ READ UNCOMMITED(未確定読み取り)
最も独立性が低い分離レベルです。
トランザクション実行中に他のトランザクションが引き起こすあらゆる更新・変更の影響を受けてしまいます。
ファントムリード、ノンリピータブルリードに加え、処理途上や不完全な状態のデータを読み込んでしまう「ダーティリード」現象が生じる可能性があります。処理を妨げるロックなどは最小限に抑えられるため最も高速に動作します。
※ダーティリードとは、データベースシステムのトランザクション処理において、あるトランザクションが処理の最中にストレージに書き込んだ未確定なデータを、他のトランザクションが読み込んで使用してしまうこと。