ACID特性とは
データベースの処理では、ある目的をもつ業務処理のひとまとまりのことをトランザクションといいます。ACID特性とは、トランザクション処理において必要とされる4つの要素、Atomicity(原子性)、Consistency(一貫性)、Isolation(独立性)、Durability(永続性)の頭文字で表したものです。
ACID特性の概要
ACID特性 | 特性の説明 | 実現機能 |
原子性 (atomicity) |
トランザクションは完全に実行されるか、 全く実行されないのどちらかでなければならない。 |
コミットメント制御 |
一貫性 (consistency) |
トランザクションの終了状態にかかわらず、 データベースの整合性が保たれなければならない。 整合性はDB内のデータに矛盾のない事を常に保証します。 |
排他制御 |
独立性 (isolation) |
トランザクションを複数同時実行しても、 単独実行の場合と同じ処理結果にならなければならない。 |
排他制御 |
耐久性 (durability) |
トランザクションの結果は、 障害が発生しても失われてはいけない。 |
障害回復機能 |
上記の独立性に関して、トランザクションが複数実行中の場合は多少なりとも他のトランザクションに影響が出ます。
そのトランザクションに影響を与える度合のことをISOLATION LEVELと言い、以下の4つに分類されます。
※直列処理の場合は、独立性は完全に保証されます。
ISOLATION LEVEL
- READ UNCOMMITTED
READ UNCOMMITTEDはコミットされていない変更を他のトランザクションから参照できる設定です。最もトランザクションの分離レベルが低いため、速度は速いです。 - READ COMMITTED
READ COMMITTEDは他のトランザクションがコミットしたデータだけを読み込みます。しかし、トランザクションの中で一度参照したデータが、同一トランザクション内でもう一度読み込んだときに違う結果を返す可能性があります。 - REPEATABLE READ
REPEATABLE READは同一トランザクション内で同じデータを複数読み込んでも同じ結果を返します。そのため、あるトランザクションで読み込んでいるデータを他のトランザクションが更新することを防ぐことができます。しかし、更新ではなく行の追加や削除は行うことができます。 - SERIALIZABLE
SERIALIZABLE(直列化)はトランザクションが互いに完全に干渉しません。よって独立性阻害要因は発生しませんが、各トランザクションの”待ち”が増えるため、速度は遅くなります。
独立性阻害要因
ダーティリード
ダーティリードは、他のトランザクションがコミット前のデータを読み込むことで発生します。コミット前のデータを読んでしまうと、そのデータがロールバックされた場合に存在しない更新データで処理を行うことになります。
ノンリピータブルリード(ファジーリード)
ノンリピータブルリードは、同一トランザクション内で同じデータを複数読み込んだ場合に違う結果を返す可能性があります。
ファントムリード
ノンリピータブルリードでは行の更新でしたが、ファントムリードは行の追加や削除をされてしまう可能性があります。
行の追加や削除が行われることで、例えば読み込んだ行数を使って処理をしていた場合等に不整合が起きてしまいます。
ロストアップデート
同じリソースに対して、ロックをかけずに複数のトランザクションが処理を行った場合に、処理結果に不整合が発生する場合があります。
ISOLATION LEVELと独立性阻害要因の関係
縦:ISOLATION LEVEL 横:独立性阻害要因 |
ダーティーリード | ファジーリード | ファントムリード | ロストアップデート |
read uncommitted | 発生 | 発生 | 発生 | 発生 |
read committed | 発生しない | 発生 | 発生 | 発生 |
repeatable read | 発生しない | 発生しない | 発生 | 発生 |
serializable | 発生しない | 発生しない | 発生しない | 発生しない |
参考にさせていただいたサイト