トランザクションのACID特性とは何か?

2020年3月21日

ACIDとは何か?

コンピュータサイエンスで使われる“ACID"とは、データベースの一貫性を維持するためにトランザクションシステムが持つべき性質のことです。
ACIDはその性質である原子性(Atomicity)、一貫性(Consistency)、独立性(Isolation)、および永続性(Durability)の英語の頭文字から来ています。

トランザクションとは何か?

そもそもトランザクションとは何なのでしょうか?
トランザクションを一言で言えば、 データベース内で実行される一連の作業の塊のことです。
データベースのイメージが付きにくければ、Microsoft社のExcelを思い浮かべてみてください。

トランザクションをExcelで表現する図

例えばExcelでお父さんと子供(ひろくん)のおこづかいを管理しているとします。お父さんから子供におこづかいをあげる場合は、お父さんのExcelのデータからおこづかい分を引いて、子供のデータに加えます。
マウス操作とキーボードで人間がやる分にはこの作業の流れも、コンピュータに操作させようとしたらいろいろと命令が必要です。
大まかに言っても、「お父さんのおこづかい表に操作した月・日・曜日、内容を記入し、出金した金額を記入する」「お父さんのおこづかい表の今月の合計の計算をする」 「子供のおこづかい表に操作した月・日・曜日、内容を記入し、入金された金額を記入する」「子供のおこづかい表の今月の合計の計算をする」 という作業が必要です。
しかし、これらの操作が終わればおこづかいの処理は完了します。この一連の流れがトランザクションです。

ACIDの4つの性質

ACIDの内容

このページの冒頭で、ACIDはその性質である原子性(Atomicity)、一貫性(Consistency)、独立性(Isolation)、および永続性(Durability)の英語の頭文字から来ていると紹介しました。
ここからは、これら4つの性質について紹介していきます。

原子性(不可分性)

原子性とは、トランザクション全て完全に実行された状態か、全く実行されない状態しかとらないとする性質です。不可分性とも呼ばれますが、人によっては「全か無かの法則」ととらえたほうが理解しやすいかもしれません。
先ほどのおこづかいの例で言うと、お父さんのおこづかいから子供のおこづかいにデータを移動させる際に、お父さんのおこづかいだけが減らされ、子供のおこづかいのデータが追加されないなど、 途中で処理が止まってしまっては大問題です。
こうした問題を防ぐために、トランザクションは完全に実行が完了するか、全く実行しないかの2つに1つしかとらないようにする必要があります。

一貫性

一貫性とは、整合性がとれたデータベースでは、トランザクション実行後も整合性がとれるという性質のことです。
もう少し簡単な言い方をすれば、データベースのルールはどのようなトランザクションがあっても破られないということです。
例えばお父さんから子供へおこづかいを渡した時に、それぞれのおこづかいの合計額に誤りがでてしまったり、「-3000円のおこづかいを渡す」というようなあり得ない処理をすることがないようにする性質です。

独立性

独立性とは同時に実行された複数のトランザクションはお互いに干渉しないという性質です。
人間がデータの移動をする場合は、複数の処理を効率的に作業するためにまとめてデータの移動をしてしまうかもしれません。
どういうことかというと、先ほどのおこづかい管理で言えば、「お父さんから子供に3,000円のおこづかいを渡す」「お父さんが1,000円の本を買う」「子供の参考書を買うために、お父さんから子供に2,000円渡す」という複数の処理が同時に発生したら、お父さんのおこづかいのデータ表をまとめて対応し、その後子供のおこづかいの対応をするかもしれません。
しかし、独立性の性質のもとではまとめて作業することはなく、それぞれの処理がお互いを知らないかのようにふるまい、自分の作業を貫徹させます。
少し非効率に見えるかもしれませんが、こうした対応の方がデータの原子性も保ちやすくなり、整理されたデータベースを維持しやすくなります。

永続性(耐久性)

永続性とは、トランザクションがコミット(承認)されると、停電やクラッシュなどのシステム障害の場合でもコミットされたままになることを保証する性質です。耐久性とも呼ばれます。
おこづかいの例を考えてみても、お父さんから子供へのおこづかいの処理をコンピュータにお願いしたのに、それがシステム障害で実行されないままになってしまったらデータベースの一貫性や信頼性がなくなってしまいます。
こうした状況を防ぐために永続性が必要になります。

参考