DBMS - トランザクション: 基本とそれを超える理解
こんにちは、未来のデータベースウィザードたち!データベーストランザクションの魅力的な世界にあなたを案内する旅に興奮しています。近所の親切なコンピュータサイエンスの先生として、このトピックで困難を乗り越える多くの学生を見てきましたが、このチュートリアルの終わりまでに、あなたはトランザクションの専門家になることを約束します!さあ、飛び込みましょう!
トランザクションとは?
本題に入る前に、基本から始めましょう。ATMでお金を引き出すと想像してみてください。カードを差し込み、PINコードを入力し、金額を選択し、現金を受け取ります。このプロセス全体、始めから終わりまでがトランザクションです。データベースの用語では、トランザクションは一連の操作を単一の論理的な作業単位として実行します。
以下は、トランザクションが pseudocode でどのように見えるかの簡単な例です:
BEGIN TRANSACTION
account WHERE id = 12345 の balance を読み取る
IF balance >= 100 THEN
account WHERE id = 12345 の balance を 100 減らす
100ドルを配布する
ELSE
"残高が不足しています"を表示する
END IF
COMMIT TRANSACTION
このトランザクションは、すべてのステップが正常に完了するか(お金が引き出され、残高が更新される)、または(お金が足りない場合、何も変更されない)いずれかです。
ACIDプロパティ
さて、トランザクションの4つの柱、ACIDプロパティについて話しましょう。これらはデータベースシステムのデータ整合性と一貫性を維持するために非常に重要です。
原子性(Atomicity)
原子性は、トランザクションが単一で分割不能なユニットとして扱われることを確保します。すべてか何もです - トランザクション内のすべての操作が正常に完了するか、またはどちらも完了しません。
例:
BEGIN TRANSACTION;
accounts WHERE id = 'Alice' の balance を 100 減らす;
accounts WHERE id = 'Bob' の balance を 100 増やす;
COMMIT;
このトランザクションのいかなる部分が失敗した場合(例えば、Bobの口座が存在しない場合)、すべてのトランザクションはロールバックされ、Aliceの残高は変更されません。
一貫性(Consistency)
一貫性は、トランザクションがデータベースを一つの有効な状態から別の有効な状態に移行することを確保します。データベースの整合性制約を維持します。
例:
BEGIN TRANSACTION;
accounts WHERE id = 'Alice' の balance を 200 減らす;
-- Aliceの残高が負になる場合、トランザクションは中止されます
COMMIT;
分隔性(Isolation)
分隔性は、トランザクションの並行実行がデータベースを並行実行しなかった場合と同じ状態にする確保します。
例:
-- トランザクション1
BEGIN TRANSACTION;
accounts WHERE id = 'Alice' の balance を 100 減らす;
-- ここに遅延が発生
accounts WHERE id = 'Bob' の balance を 100 増やす;
COMMIT;
-- トランザクション2
BEGIN TRANSACTION;
accounts WHERE id = 'Alice' の balance を選択;
COMMIT;
分隔性は、トランザクション2がAliceの残高が移動前または移動後のいずれかを見るが、中間の状態を見ることはありません。
持久性(Durability)
持久性は、トランザクションがコミットされた後、電源の損失、クラッシュ、またはエラーが発生した場合でも保持されることを保証します。
例:
BEGIN TRANSACTION;
audit_log に ('User login', CURRENT_TIMESTAMP) を挿入;
COMMIT;
挿入されたレコードは、システムがその後すぐにクラッシュした場合でも保持されます。
並行性(Serializability)
並行性は、トランザクション間の分離の最高レベルです。トランザクションの並行実行が、これらのトランザクションが並行順序のいかなる順序で実行された場合のデータベース状態と同じ結果をもたらすことを確保します。
例:
トランザクション1: R(X), W(X)
トランザクション2: R(X), W(X)
可能な並行スケジュール:
- T1 を T2 に続けて実行: R1(X), W1(X), R2(X), W2(X)
- T2 を T1 に続けて実行: R2(X), W2(X), R1(X), W1(X)
並行スケジュールが serialization 可能であるためには、その結果がこれらのいかなる並行スケジュールの結果に等価でなければなりません。
等価スケジュール
2つのスケジュールが以下の条件を満たす場合、等価と見なされます:
- 同じトランザクションセットを含む
- 非中止トランザクションの競合操作を同じ順序で並べる
例:
スケジュール1: R1(X), R2(X), W1(X), W2(X) スケジュール2: R2(X), R1(X), W1(X), W2(X)
これらのスケジュールは等価です。なぜなら、競合操作(W1(X) と W2(X))が両方のスケジュールで同じ順序にあるからです。
トランザクションの状態
トランザクションは、その生命周期を通じて異なる状態を経験します。以下の表は、これらの状態を要約しています:
状態 | 説明 |
---|---|
活動中 | 初期状態;トランザクションが実行中にこの状態に留まります |
部分的にコミット | 最終ステートが実行された後 |
失敗 | 正常な実行が進まなくなった場合 |
中止 | トランザクションがロールバックされ、データベースがトランザクション開始前の状態に戻された場合 |
コミット | トランザクションが正常に完了した後 |
これらの状態を理解することは、トランザクションを効果的に管理し、データ整合性を確保するために非常に重要です。
結論として、トランザクションはデータベース管理システムの基本概念であり、データの一貫性と整合性を確保します。ACIDプロパティ、並行性、等価スケジュール、トランザクションの状態を理解することで、データベースの専門家になる道筋が開けます!
忘れないでください、練習は完璧を生みます。これらの概念を実データベースシステムに実装してみてください。トランザクションの強力さを実感するでしょう。未来のデータベース管理者、お楽しみください!
Credits: Image by storyset