【データベース】トランザクション管理について: ACID特性
2022.05.14 /
本記事ではデータベース操作で使用されるトランザクション管理について解説していきます。
Webアプリケーションなどでリレーショナルデータベースを扱う場合、トランザクション管理はとても重要な知識の一つです。リレーショナルデータベースについて詳しくは以下記事をご参照ください。
データベースとは?機能と特徴(SQLite、MySQL、TinyDB)
データの整合性を保つためにはトランザクション管理をしっかり行う必要があります。
ぜひ本記事を通してデータベースのトランザクション管理について理解を深めてください。
トランザクション管理
トランザクションとは
トランザクション(transaction)という単語は本来「処理」や「取引」といった意味で使用されます。
しかしリレーショナルデータベースの世界では、
トランザクションはデータの一貫性を確保するために一連の処理(複数のレコード操作)をひとまとめにしたものを指します。
例として銀行口座への入金・送金を考えてみましょう。Aさんは自分の口座から3万円をBさんの口座へ送金し、その後現金で自分の口座へ5万円を入金したとします。トランザクション管理では、この2つの操作を1つのトランザクションとして扱います。トランザクションの流れとしては次のようになります。
- トランザクションの開始
- 口座から3万円をBさんの口座へ送金
- 現金5万円を口座へ入金
- トランザクションの終了
上記のようにトランザクション管理では連続した複数のデータベース操作を1つのトランザクションにまとめます。
このトランザクション管理にはコミットとロールバックという重要な仕組みがあります。
コミットとロールバック
例に挙げた銀行口座への入金・送金で、送金は成功したが入金は失敗した場合を考えてみましょう。この場合、「Bさんの口座のお金は増えているが、Aさんの口座は3万円減っただけで増えていない」という結果になり、データの一貫性(整合性)が保たれていません。
このようなことが発生しないようにトランザクション管理にはロールバック(ROLLBACK)という機能があります。ロールバックとは一連の処理(レコードの登録・変更・削除)をなかったことにすることです。
もしトランザクションの途中でエラーが発生したら、ロールバックを行ってデータの整合性を保つということです。
またトランザクションの一連の処理が無事完了したら、実行した処理(SQL)を確定させます。この処理を確定することをコミット(COMMIT)といいます。
- コミット(COMMIT):トランザクションの処理を確定する
- ロールバック(ROLLBACK):トランザクションの処理をすべてなかったことにする
ACID特性
トランザクションには4つの特性を持っています。それぞれの特性の頭文字を組み合わせてACID特性と呼ばれています。
それぞれの特性について見ていきましょう。
Atomicity(原子性)
Atomicity(原子性)とは、トランザクション内の処理は「すべて実行される」か「すべて実行されていない」のいずれかの状態になるという特性です。
一連の処理の中で一部だけ実行が確定されるということは原子性に反することになります。
Consistency(一貫性)
Consistency(一貫性)とは、トランザクションの前後でデータの整合性が保たれているという特性です。
データベースのデータには矛盾が存在しないということです。
Isolation(独立性)
Isolation(独立性)とは、トランザクションンが他のトランザクションに影響を与えないという特性です。
トランザクション同士はお互いに干渉せず、同時実行でも単独実行でも同じ結果となります。
Durability(永続性)
Durability(永続性)とは、トランザクションがコミットされれば障害が発生しても更新内容は失われることはないという性質です。
システム障害によって、一貫性が損なわれないために永続性が重要となります。