Database2 | Transaction
トランザクションとは、単一の論理的な作業単位を形成する操作の集合。
ACID原則
トランザクションは以下の4つの性質を全て満たすことが求められる(ACID原則)。
1.原子性(Atomicity)
- トランザクションのすべてのアクションが完全に実行されること。
- 何らかの失敗が発生した場合にはトランザクションの部分的な影響が取り消されること。
2.一貫性(Consistency)
- 共有データの更新を制御すること。これにより複数のトランザクションが同時に実行されることを防止し、データベースに保存されているデータが誤って更新されることが無いようにする。
3.分離性(Isolation)
- 同時に実行されている他のトランザクションの影響からトランザクションを分離すること。
4.耐久性(Durability)
- トランザクションが正常に実行された場合、その効果がデータベース内に持続すること。
トランザクションの5つの状態
1.アクティブ(Active)
-
初期状態。トランザクションの実行中はこの状態を維持する。
-
例:データベースシステムを起動した後の状態。システム管理部門がデータベースシステムのメンテナンスが完了し、システムを再起動した後の状態。
2.部分コミット(Partially committed)
-
最終ステートメントが実行された後。
-
ハードウェアの問題によりAborted状態に遷移する可能性もある。
-
例:販売管理システムと在庫管理システムを想定する。受注登録が完了した状態は、データベースの受注テーブルに受注レコード(販売管理システムが参照)が登録され、データベースの在庫テーブル(在庫管理システムが参照)の該当商品レコードの有効在庫数フィールドを減らすための更新処理が完了した状態である。また、販売管理システムにおいては受注単位で受注レコードが登録される。この例においては、新規の受注レコードの登録が1つのトランザクションである。すなわち、この例における受注登録においては、1つのトランザクションに商品Aと商品Bの2つの品目が含まれている。したがって、この2つの品目すべてが登録されることで1つの受注レコードが登録完了、すなわち1つのトランザクションが完了する。
-
1つ目の商品Aについて受注登録が完了して受注テーブルと在庫テーブルの更新が完了した。2つ目の商品Bについて受注登録が完了していない。この状態はPartially committedの状態である。
3.失敗(Failed)
-
通常の実行ができなくなったことが判明した後。
- 内部論理エラー
- ハードウェアエラー
-
その後、Aborted状態に遷移する。
-
例:上記の受注登録処理において、1つ目の商品Aの受注登録が完了したタイミングで、ハードウェアがビジー状態となり書き込み出来なくなった。これによりデータベースシステムはFailedの状態となった。
4.中止(Aborted)
-
トランザクションがロールバックされ、データベースが開始前の状態に復元された後。
-
次のステップとして以下の選択肢がある。
- Restart
- 内部論理エラー以外のエラーによる場合。
- ハードウェアのエラー
- ソフトウェアのエラー
- 内部論理エラー以外のエラーによる場合。
- Kill
- 内部論理エラーによる場合。
- アプリケーションプログラムのエラー
- 誤ったインプット情報
- データベースに適切なデータが無い
- 内部論理エラーによる場合。
- Restart
-
例:上記の受注登録処理がFailedの状態となった後、データベースシステムはトランザクションをロールバックした。具体的には、データベースを1つ目の商品Aの受注登録をする前の状態に戻した。この状態はAbortedの状態である。
5.コミット(Committed)
- 正常終了後
- 例:上記の受注登録処理がAbortedの状態となった後、ハードウェアのビジー状態が解消して書き込みができる状態となったので、データベースシステムはトランザクションをRestartした。Restart後は、最初の処理と同様に1つ目の商品Aの受注登録が完了してPartially Committedの状態を経た後に、2つ目の商品Bの受注登録も完了し、これにより1つのトランザクションが完了した。この状態はCommittedの状態である。
デッドロックからの回復
デッドロックからの回復手順は以下の通り。
- デッドロック検出メカニズムは、どのロックを解放する必要があるかをコスト計算に基づき決定する。
- 決定においてはStarvationを考慮。
- 回復メカニズムは、部分的なロールバックを実行する。
- 部分ロールバック後にトランザクションを再開する。
Step1. Selection of a victim
- 最小コストが発生するトランザクションをロールバックする。
- コストの計算方法として以下の候補がある。
- a. トランザクションが計算した時間と、トランザクションが指定されたタスクを完了するまでに計算する時間。
- b. トランザクションが使用したデータ項目の数。
- c. トランザクションが完了するまでに、あといくつのデータ項目が必要か。
- d. ロールバックに関与するトランザクションの数。
Step2. Rollback
- 特定のトランザクションをロールバックしなければならないと決定したら、そのトランザクションをどこまでロールバックするかを決定しなければならない。
- 全ロールパックがシンプルだが非効率。
- 必要な範囲で部分ロールバックすることが効率的。
- 実行中のすべてのトランザクションの状態に関する追加情報をシステムが保持する必要がある。
- 例:トランザクションが実行したロック要求/許可と更新のシーケンス。
- 実行中のすべてのトランザクションの状態に関する追加情報をシステムが保持する必要がある。
Step3. Starvation
- 最小コストを基に判断すると同じトランザクションがVictimに選ばれ続けるリスクがある。
- 犠牲者(Victim)として選ばれる回数を制限する必要あり。
- 最も一般的な解決策は、ロールバックの回数をコスト係数に含めること。
Discussion