トランザクションとは?
トランザクションは「一連の処理をひとまとまりとして扱う単位」です。「全部成功」か「全部なかったこと(ロールバック)」のどちらかしかない状態にします。
銀行振込のトランザクション例
① A口座から1万円を引き出す(A残高: 10万→9万)
② B口座に1万円を入金する(B残高: 5万→6万)
③ ここでシステムクラッシュ!
トランザクションなし → A残高だけ減ってBに届いていない(お金が消える)
トランザクションあり → ①も②もロールバック(なかったことに)
トランザクションあり → ①も②もロールバック(なかったことに)
ACID特性の4つの性質
ACID — データベースの信頼性の4要素
A — 原子性(Atomicity)
トランザクションは「全部成功」か「全部失敗(ロールバック)」の二択
途中半端な状態にならない
例:振込の①だけ実行されることはない
途中半端な状態にならない
例:振込の①だけ実行されることはない
C — 一貫性(Consistency)
トランザクション前後でデータベースの制約を満たし続ける
例:残高がマイナスにならない制約が常に守られる
※ 「一貫性 ≠ 隔離性」(混同注意)
例:残高がマイナスにならない制約が常に守られる
※ 「一貫性 ≠ 隔離性」(混同注意)
I — 隔離性(Isolation)
並行して実行中の複数トランザクションが互いに干渉しない
例:2人が同時に同じ在庫を予約しても矛盾が起きない
→ ロック機構で実現
例:2人が同時に同じ在庫を予約しても矛盾が起きない
→ ロック機構で実現
D — 耐久性(Durability)
コミット(確定)したトランザクションは障害後も失われない
例:クラッシュ後も送金完了のデータは残る
→ WAL(Write-Ahead Log)で実現
例:クラッシュ後も送金完了のデータは残る
→ WAL(Write-Ahead Log)で実現
隔離性のレベルと問題
隔離レベルが低い場合に起きる問題
| 問題 | 説明 | 例 |
|---|---|---|
| ダーティリード | コミット前のデータを他が読める | 未確定の在庫数を見てしまう |
| ノンリピータブルリード | 同じデータを2回読むと値が変わる | 読み直したら残高が変わっていた |
| ファントムリード | 同じ条件で検索すると件数が変わる | 集計中に新しい行が追加された |
デッドロック
2つのトランザクションが互いのロック解放を待ち続けて処理が止まる状態です。
デッドロックの発生例
トランザクションA: テーブル1をロック → テーブル2のロックを待つ
トランザクションB: テーブル2をロック → テーブル1のロックを待つ
永遠に待ち続ける → デッドロック発生!
DBMSが検知 → どちらかをロールバックして解消(デッドロック検出機構)
データベース正規化(基礎)
正規化はデータの重複・更新異常を排除するためのテーブル設計手法です。
第1正規形(1NF)
1つのセルに1つの値のみ(繰り返しグループを排除)
第2正規形(2NF)
主キーの一部だけに依存する列を別テーブルに分離(部分関数従属の排除)
第3正規形(3NF)
非キー列から非キー列への依存を排除(推移関数従属の排除)
試験ポイントまとめ
原子性 = 全成功か全ロールバック。一貫性 = 制約を常に満たす
隔離性 = 並行トランザクションの干渉防止(ロック機構)
耐久性 = コミット後は障害でも失われない(WALで実現)
一貫性(C)と隔離性(I)は混同しやすい。一貫性=制約、隔離性=並行制御