トランザクションについて
よく銀行の振込例などが出てくるトランザクションについて、技術者試験などを通して仕組みは理解していましたが、詳細部分まで意識したことがありませんでした。
実際の業務では、どんどんと使っていく概念、技術なので今回はこのトランザクションについてまとめていきます。
トランザクションとは?
トランザクションとは、データベース操作において一連の操作をひとまとまりとして扱う概念です。
ACID特性(Atomicity:原子性、Consistency:一貫性、Isolation:独立性、Durability:永続性)を持つことが求められます。
ACID特性を持つことによってデータの整合性が保証され、システムの信頼性が向上します。
基本概念
Atomicity(原子性)
トランザクション内の全ての操作は一つの不可分な単位として扱われ、全操作が完了するか、または全く実行されないかのどちらかです。(ALL OR NOTING)
部分的に実行されることはありません。
Consistency(一貫性)
トランザクション開始前後で、データベースの状態が一貫したものでなければなりません。
つまり、トランザクションが成功すればデータの一貫性が保たれ、失敗すれば前の状態に戻り一貫性を保ちます。
Isolation(独立性)
複数のトランザクションが同時に実行される場合、それぞれのトランザクションは他のトランザクションから独立して実行されなければなりません。
他のトランザクションの途中経過が見えることはなく、最終結果だけが見えます。
Durability(永続性)
トランザクションが一度コミットされると、その結果は永続的に保存されます。
システム障害が発生しても、コミットされたデータは失われません。
トランザクションの具体例
冒頭で出た銀行システムの振込処理で考えてみます。
口座Aから口座Bへの振込操作は以下のような手順で行われます。
1.口座Aの残高から振込金額の減額
2.口座Bの残高に振込金額を加算
この振込操作全体が一つのトランザクションとして扱われます。
ここでは、原子性が重要になり、もし操作1が成功し操作2が失敗した場合は、口座Aからはお金が引き落とされたが、口座Bには入金されないといった不整合な状態が発生します。
これを避けるために、両操作を一つのトランザクションとして実行し、どちらかが失敗した場合は全ての操作がロールバック(取り消し)されます。
コミットとロールバック
コミット(Commit)
コミットは、トランザクションの一連の操作が正常に完了し、その結果をデータベースに確定させる操作です。
コミットが成功すると、そのトランザクションの結果は永続的に保存され、他のトランザクションからも参照可能になります。
先ほどの振込例では、口座Aと口座Bの残高が更新され、その変更が確定されるのがコミットです。
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 'A';
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 'B';
COMMIT;
このSQLスクリプトでは、トランザクション開始後、2つの更新操作が行われ、コミットによって結果を確定させます。
ロールバック(Rollback)
ロールバックは、トランザクションの途中でエラーが発生した場合や、意図的に操作を取り消したい場合に、トランザクション開始時点の状態に戻す操作です。
これにより、データベースの整合性が保たれます。
振込例では、口座Aから引き落としは行われたが、口座Bへの入金が失敗した場合、ロールバックを行うことで口座Aの引落しも取り消され、元の状態に戻されます。
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 1000 WHERE account_id = 'A';
UPDATE accounts SET balance = balance + 1000 WHERE account_id = 'B';
-- エラーが発生した場合
ROLLBACK;
このSQLスクリプトでは、途中でエラーが発生した場合にロールバックが実行され、口座Aの引き落としが取り消されます。
トランザクションとデータベースの関係性まとめ
トランザクションは、データベース操作の整合性と信頼性を保証する重要な概念です。
ACID特性のもと、ロールバックとコミットにより、トランザクションの役割を果たし、システムの検漏性を大幅に向上させます。
ACID特性について詳しく知りたい方はこちら。