こんにちは!
Web バックエンド担当の小山です。
「Web エンジニアなら知っておきたい」ということで、今日は 「トランザクション」 についてです。
トランザクション とは
データベースにおいて、一連のデータ操作を1つのまとまりにして取り扱う仕組みです。
これにより、相互依存のある複数の操作が全て完了するか・全てキャンセルされることを保証しデータベースの整合性と一貫性を保つことができます。
トランザクションには 「ACID特性」 と呼ばれる4つの性質があります。
「ACID特性」とは
トランザクション処理が満たすべき性質として、ACID特性があります。以下、4つの性質があります。
- Atomicity(原子性)
- Consistency(一貫性/整合性)
- Isolation(独立性/分離性)
- Durability(永続性)
※それぞれの頭文字をとって「ACID(アシッド)」となっています。
トランザクションの重要性
トランザクションが重要な場面は、複数の更新処理を連続して行う際に、全ての更新処理が成功しなければデータベースに更新をかけないようなシーンです。
(逆にいうと、一つでも処理に失敗したらNGとすべきシーン)
何かが原因で一部の処理が失敗した場合に、ロールバックを実行して処理全体をリセットすることができます。
トランザクションの基本操作
通常の SQL 操作で使われるようなコマンドは下記があります。
主なコマンド
- BEGIN
- トランザクションを開始します。
- これ以降の操作は一つのトランザクションとしてまとめられます。
BEGIN;
- COMMIT
- トランザクション内の操作を確定します。
- 変更がデータベースに保存されます。
COMMIT;
- ROLLBACK
- トランザクション内の操作を取り消します。
- データベースはトランザクション開始前の状態に戻ります。
ROLLBACK;
例
商品在庫の更新をトランザクションで行います。
- 商品Aの在庫を減らす。
- 商品Bの在庫を増やす。
BEGIN; UPDATE inventory SET quantity = quantity - 10 WHERE product_id = 'A'; -- 商品Aの在庫を10減らす UPDATE inventory SET quantity = quantity + 10 WHERE product_id = 'B'; -- 商品Bの在庫を10増やす COMMIT;
また、 ROLLBACK
のSQL文を実行することで、明示的にロールバックを行うことも可能です。
BEGIN; UPDATE inventory SET quantity = quantity - 10 WHERE product_id = 'A'; -- 商品Aの在庫を10減らす ROLLBACK; -- 変更を取り消す
ACID特性の詳細
トランザクションの4つの特性である ACID についてより詳しく説明します。
Atomicity(原子性)
トランザクション内の操作がすべて成功するかすべて失敗するかのいずれかであることを保証すること。
例: 在庫管理システムでの購入操作
たとえば、ユーザーが商品を購入した場合、以下の操作が行われます。
- 在庫数を減らす操作が実行される。
- 購入記録を記録する操作が実行される。
もしトランザクション中のどちらか一方が失敗した場合(たとえば、在庫数が不足していたために在庫更新が失敗した場合)、トランザクション全体が失敗し、データベースは元の状態にロールバックされます。
このように、原子性は操作がすべて成功するかすべて失敗するかのいずれかであることを示します。
Consistency(一貫性/整合性)
トランザクションが実行される前後でデータベースの状態が一貫していることを保証すること。
データベースの整合性が保たれること。
例: ある口座から別の口座へお金を振り込む場合の送金操作
- Aさんの口座から5,000円差し引き、残高が10,000円 - 5,000円 = 5,000円になる
- Bさんの口座に50,00円プラスされ、残高が20,000円 + 5,000円 = 25,000円になる
しかし、Aさんが5,000円送金した直後にシステムトラブルが起きた場合、途中で中断されるとデータの整合性が取れなくなってしまいます。
更新処理の最中に何かしらの要因で処理が中断されたりすると、データの整合性が取れなくなる可能性があるので、複数の更新処理をまとめてトランザクションにすることで、データの安全性を担保することができます。
Isolation(独立性/分離性)
同時に実行される複数のトランザクションが、互いに影響を及ぼさないように隔離されること。
トランザクション同士が互いに干渉を受けないことを保証する性質です。
Aさんがトランザクションを実行しているときに、Bさんがトランザクションを開始しても、影響が及ばないようにすることです。
これにより、トランザクション同士が互いに干渉することなく、それぞれが安全に処理されることが保証されます。
Durability(永続性)
トランザクションが完了した後、その結果は永続的にデータベースに保存されること。
永続性は、システム障害など発生した場合でも、完了したトランザクションの結果が保持され続けることを保証します。
終わりに
トランザクションを効果的に活用することで、データの整合性を保ちながら安全で効率的なデータベース操作を行うことが可能です。
次回の「Web エンジニアなら知っておきたい」シリーズもお楽しみに!
参考
- What is a database transaction? https://fauna.com/blog/database-transaction
- トランザクションとは【RDB】 https://zenn.dev/iosamu/articles/012d61c58482ad