まえがき
ACID特性とはトランザクションが満たさなければいけない4つの性質である。最近はNoSQLとリレーショナルデータベースの対比で用いられることも増えてきたため、きちんと意味を理解したい。
トランザクションとは
現実世界における1つの処理、例えばATMを利用してお金を振り込むという処理をすると、銀行のシステム内部では複数のSQLが実行される。簡単に言えば、依頼人の残高をUPDATEして(減らして)、振込先の残高をUPDATEする(増やす)のである。この2つのSQLはどちらか片方だけ実行しても無意味なのであり、両方実行されて初めて現実世界においてお金を振り込んだことになる。現実世界の1つの処理に対応した複数のSQL(この例でいえば、2つのUPDATE文)のかたまりをトランザクションと呼ぶ。
想定するシチュエーションとそれを実現するトランザクション
ACIDを語るときは、銀行の入出金のシチュエーションを考えるのが良い。ここでは以下のシチュエーションを想定する。
AさんはBさんにX円送金する。
さて、上記のシチュエーションはデータベースの世界ではどのようにして実現されるだろうか。例えば、銀行口座というテーブルがあり、Aさんの残高、Bさんの残高を保存しているとしよう。すると、Aさんの残高からX円引き、Bさんの残高にX円足せば送金できる。したがって、このシチュエーションは、次の2つのSQLによって実現されるだろう。
- UPDATE TABLE 銀行口座 SET 残高 = 残高 - X WHERE 名前 = 'A';
- UPDATE TABLE 銀行口座 SET 残高 = 残高 + X WHERE 名前 = 'B';
この2つのSQLを1つのトランザクションとして実行するとき、トランザクションが満たすべき4つの性質(Atomicity,Consistency,Isolation,Duration)についてそれぞれ説明する。これらの性質が満たされないとどんな不具合が起きるかという点から理解すると良いと思う。
Atomicity(原子性)
Atomicityとは、トランザクションが完了した時点において、トランザクションの中身がすべて実行完了したか、まったく実行されていないかのどちらかしか起こらないという性質である。例えば、1のSQLは実行したが2のSQLは失敗した、という中途半端な状態でトランザクションが終了することは許されない。現実世界においては、送金完了したか、送金失敗したかのどちらかしかない。もしこの性質を満たさないとすれば、送金の途中で取引が終了してしまう可能性がある。
Consistency(一貫性)
Consistencyとは、トランザクションの実行完了ごとにデータベースが一貫性を維持するという性質である。データベースの一貫性とは、正常な状態から正常な状態へ遷移することである。異常な状態とは、残高が負の値になるなどである。もしこの性質を満たさないとすれば、トランザクション終了後にAさんの残高がマイナスになってしまう可能性がある。
Isolation(独立性)
Isolationとは、トランザクションの実行は、他のトランザクションに影響を受けないし、影響を与えないという性質である。この性質が満たされないとすれば、AさんとCさんが同時にBさんに送金した場合に、どちらかの送金が消失する可能性がある。
Duration(永続性)
Durationとは、トランザクションの実行により行われたデータベースへの変更は永続するという性質である。銀行口座というテーブルが保存しているデータは、過去のすべての入出金のトランザクションの積み重ねである。もしこの性質が満たされないとすれば、過去に行った送金処理がなかったことになるということが起こりうる。
あとがき
ACID特性を理解するには、現実世界とのつながりを考える必要があるなと感じました。