トランザクション処理
ACID特性、専有ロックと共有ロック、デッドロック、ロールバックとロールフォワードによる障害回復、インデックスによる性能向上を理解できるようになります。
ねらい
データベースの信頼性を支える仕組みを学びます。このレッスンを終えると、ACID特性の4つの意味、ロックによる排他制御とデッドロック、障害からの回復の手順、インデックスの考え方を説明できるようになります。
ストーリー
銀行振込は「あなたの口座から1万円を引く」と「相手の口座に1万円を足す」という2つの更新でできています。引き落としだけ成功して入金が失敗したら、1万円が消えてしまいます。2つで1つ。途中半端は許されない。このひとまとまりの処理がトランザクションであり、それを守る仕組みがこのレッスンの主役です。
ACID特性:トランザクションに求められる4つの性質
複数の利用者が同時に使うデータベースでは、トランザクション処理に次の4つの特性(ACID特性)が求められます。
| 特性 | 意味 |
|---|---|
| 原子性(Atomicity) | すべて実行されるか、まったく実行されないかのどちらかであること |
| 一貫性(Consistency) | 処理の前後でデータの整合性が保たれること |
| 独立性(Isolation) | 同時に実行される他のトランザクションの影響を受けないこと |
| 耐久性(Durability) | 完了した結果は障害が起きても失われないこと |
冒頭の振込の「2つで1つ、途中半端は許されない」は原子性そのものです。
同時実行制御:ロックで衝突を防ぐ
複数のトランザクションが同じデータを同時に更新すると、整合性が壊れます。そこで、使用中のデータに鍵をかけるロック方式が使われます。
- 専有ロックは、更新のためにかける鍵です。かかっている間、他のトランザクションは読むことも書くこともできません。
- 共有ロックは、読み取りのためにかける鍵です。他のトランザクションも読むことはできますが、更新はできません。
鍵をかける範囲(表全体か、行単位か)をロック粒度といい、細かいほど同時実行性は上がりますが管理の負担が増えます。制御の仕組みには、資源の空きを数で管理するセマフォ方式もあります。
注意すべき現象がデッドロックです。トランザクションAがデータ1をロックしてデータ2を待ち、トランザクションBがデータ2をロックしてデータ1を待つと、互いに相手の解放を待ち続けて止まってしまいます。DBMSはこれを検知して、どちらかを強制的に取り消して解消します。
分散した複数のデータベースをまたぐ更新では、全員が「実行してよいか」を確認し合ってから確定する2相コミットメントというコミットメント制御が使われます。
障害回復:壊れる前の正しい状態へ戻す
DBMSは、更新の記録をジャーナルファイル(ログファイル)に残し続けています。また、一定の間隔でデータベースとログの整合を取る区切りをチェックポイントといいます。障害からの回復には2つの向きがあります。
- バックワードリカバリ(ロールバック)は、更新前の記録を使い、中途半端に終わったトランザクションの変更を取り消して元に戻します。
- フォワードリカバリ(ロールフォワード)は、バックアップの時点から更新後の記録を再適用して、障害直前の状態まで進めます。ディスク障害のときはバックアップにこの処理を組み合わせて回復します。
システムの再開の仕方には、チェックポイントの情報を使って速やかに再開するウォームスタートと、初期状態から立ち上げ直すコールドスタートがあります。
性能向上とアクセス制御
インデックス
検索を速くするための索引がインデックスです。本の巻末の索引のように、目的のデータの場所へ直行できます。代表的な種類に、木構造で範囲検索にも強いB-treeインデックス、値の種類が少ない列に向くビットマップインデックス、一致検索に強いハッシュインデックス、重複のない列に張るユニークインデックス、データの並びと一体化したクラスタ化インデックス、問合せに必要な列をすべて含むカバリングインデックス、全文検索に使う転置インデックスがあります。インデックスは検索を速くする一方、更新のたびに索引の維持が必要になるため、インデックス数を増やしすぎると更新の負荷が上がります。
アクセス制御
利用者ごとに、データベースに接続する権限、データを検索する参照権限、新規登録する挿入権限、更新する権限、削除する削除権限を使い分けて与えます。必要最小限の権限だけを与えることが安全の基本です。
例題
次の問いに答えてください。
問1 2つのトランザクションが互いに相手のロックの解放を待ち続けて、処理が進まなくなる現象を何といいますか。
問2 更新前のログを使って、中途半端に終わったトランザクションの変更を取り消す回復処理を何といいますか。
解答と解説
問1の答えはデッドロックです。DBMSはデッドロックを検知すると、どちらかのトランザクションを取り消して解消します。
問2の答えはバックワードリカバリ(ロールバック)です。バックアップから更新後ログを再適用して進めるフォワードリカバリ(ロールフォワード)と、回復の向きが逆です。
応用
本試験を意識した問題を解いてみましょう。
問 トランザクションのACID特性のうち、「処理がすべて実行されるか、まったく実行されないかのどちらかである」ことを保証する特性はどれでしょうか。次の中から選んでください。
- 原子性
- 一貫性
- 独立性
- 耐久性
解答と解説
答えは1の原子性(Atomicity)です。銀行振込の引き落としと入金のように、分割できないひとまとまりとして扱うことを保証します。2の一貫性は、処理の前後でデータの整合性が保たれるという特性です。3の独立性は、同時に実行される他のトランザクションの途中経過から影響を受けないという特性です。4の耐久性は、いったん完了したトランザクションの結果が障害後も失われないという特性であり、「全部か無しか」の保証とは別の観点です。
分からなかった点・気になった点
読み込み中です。