ACID
ACID はデータベーストランザクションの4つの基本 特性 であり、データの信頼性 と一貫性 を保証 する。

Transaction(トランザクション)
データベーストランザクションとは、データベースに対 する一連 の読 み取 りと書 き込 み操作 のことである。すべての操作 が正常 に実行 された場合 のみトランザクションがコミットされ、途中 で失敗 した場合 はすべての操作 がロールバックされる。
Atomicity(原子性)
トランザクション内 の操作 は、すべて完了 するか、すべて失敗 するかのどちらかである。
Consistency(一貫性)
トランザクションによるデータベースの変更 は、データベースを一貫性 のある状態 から別 の一貫性 のある状態 に遷移 させなければならない。
Isolation(分離性)
トランザクション間 の分離 レベルには4つのレベルがある:
| 分離レベル | 説明 |
|---|---|
| Read Uncommitted | 未コミット読み取り |
| Read Committed | コミット済み読み取り |
| Repeatable Read | 反復可能読み取り |
| Serializable | 直列化可能 |
Read Uncommitted
- 特性:他 のトランザクションがまだコミットしていないデータを読 み取 ることができる
- 防止する問題:なし
- 発生しうる問題:ダーティリード(Dirty Read)
- 適用シナリオ:
- データ不整合 の問題 が発生 しやすいため、使用 は稀
- データ一貫性 は最低 だが、パフォーマンスは最高
- パフォーマンスがデータの正確性 より重要 な場合 に使用 される可能性 がある
Read Committed
- 特性:コミット済 みのデータのみ読 み取 ることができる
- 防止する問題:ダーティリード
- 発生しうる問題:反復不能読み取り(Non-Repeatable Read)
- 適用シナリオ:パフォーマンスとデータ一貫性 のバランスが良 く、読 み取 り操作 が書 き込 み操作 より多 いアプリケーションに適 している
Repeatable Read
MySQL デフォルトの分離レベル
InnoDB ストレージエンジンでは、ギャップロック(Gap Lock)機構 によりファントムリードを防止 するが、特定 の状況 ではファントムリードが発生 する可能性 がある。良好 なデータ一貫性 を提供 し、ほとんどのアプリケーションシナリオに適 している。
- 特性:同
じトランザクション内
で複数回
の
SELECTが一貫 したデータを返 す必要 がある
Serializable
- 特性:最高 の分離 レベル。トランザクションを順次 実行 させ、コミット済 みのデータのみ読 み取 り可能
- 防止する問題:ダーティリード、反復不能 読 み取 り、ファントムリードを完全 に防止
- 適用シナリオ:
- 読 み書 きが互 いに干渉 しない / 複数 のトランザクションが同時 に実行 される際 、各 トランザクションの操作 が互 いに影響 しない
- パフォーマンスは最低 。読 み取 った行 と隣接 するギャップをロックするため、同時実行性 が低下 する
- 金融 取引 システムなど、極 めて高 いデータ一貫性 が要求 されるアプリケーションに適 している
Serializable の例:
| Time | Transaction A | Transaction B |
|---|---|---|
| T0 | SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; | SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; |
| T1 | BEGIN; | BEGIN; |
| T2 | SELECT * FROM employees WHERE id = 1 FOR UPDATE; | |
| T3 | UPDATE employees SET salary = 6666.00 WHERE id = 1 FOR UPDATE; (ブロックされる) | |
| T4 | UPDATE employees SET salary = 33333.00 WHERE id = 1; | |
| T5 | COMMIT; | |
| T6 | UPDATE employees SET salary = 99999.00 WHERE id = 1; | |
| T7 | COMMIT; |
Durability(永続性)
データの永続性 。トランザクションがコミットされると、その結果 は永続的 であり、システム障害 が発生 しても失 われない。