ACIDに対する批判

はじめに

DBのDocumentを見ていると「ACID transactionをサポートしています」という説明を目にすることがあります。自分はこれを見て、「ちゃんとtransactionサポートしてんのかぁ」くらいの感想しか持ってなかったんですが、最近読んでるデータ指向アプリケーションデザインという書籍の中で、ACIDという用語はマーケティング用語だって批判をしていて軽く衝撃を受けました。データ指向アプリケーションデザインで綺麗にまとめられていた内容について備忘録的にまとめようと思います。

ACIDとは何であるか

トランザクションが保証する安全性として、Atomicity、Consistency、Isolation、Durabilityの4つがあり、これらの頭文字をとってACIDと呼ばれています。順に説明しながら批判を整理していきます。

Atomicity / 原子性

Computer Scineceの分野ではそれ以上分割できないものを指してAtomicな処理と表現されることは一般的だと自分は理解しています。並行処理、マルチスレッドプログラミングなどでも同様にatomicityは出てきますが、この文脈だと他のスレッドからatomicな操作処理の途中が見えないことを意味したりします。

一方でACIDのAtomicityは並行性と全く関係がないです。複数のプロセスがデータに同時にアクセスしようとした際に起こることを記述しているのは、I(Isolation)であってAtomicityではないです。

Atomicityが意味するところは、なんらかの原因(プロセスがクラッシュしたりNetwork障害で処理が途中で止まったり)で処理が止まった際、TransactionがCommitされなかったらAbort(中断)されることを保証することです。中途半端な状態でデータが変更されてた場合に、Transactionをリトライしちゃうと、同じ変更を2回行ってしまって意図しないデータ変更が生じるリスクがありますが、ACIDのAtomicityはこういうことがないことを保証してくれるので、アプリケーションロジックをシンプルに保つのに役立ちます。

データ指向アプリケーションデザインでは、AtomicityではなくAbortabilityを当てた方がよかっただろと批判していますが、よくよく考えると確かにそうだなあと感じました。自分は雰囲気で用語を理解してました。

Consistency / 一貫性

分散システムにおける一貫性が、文脈によって意味合いが異なることを本書では指摘しています。著者によると、少なくとも4種類はある、と…

  • レプリカ間のデータの一貫性。非同期にレプリケーションを行う場合、結果整合性は保証するがデータの”一貫性”がないタイミングというのが出てくる
  • コンシステントハッシュ法におけるコンシステント。パーティションの境界をリバランシグするための手法なのでACIDとは全く関係ない
    • 書籍ではコラムとして紹介されてますが、コラム読むだけだと何言ってるのか微妙にわかりませんでした
  • CAP定理の一貫性は線形化可能性の意味で使われる
  • ACIDの文脈における一貫性は、データベースが「良い状態」にあることを示すアプリケーション固有の概念を指す

一貫性という用語の一貫性がないですね。

ACIDの文脈でよく例に出されるのが口座の例ですね。データベースにはルールがあって、送金処理を行なったときに間違えて口座残高が負になっちゃってたりしたらダメだよね、みたいな説明が出てくるかと。Wikipediaもそんな感じの説明してます。

ACID (コンピュータ科学) - Wikipedia

これはアプリケーションの責務であってデータベースの責務ではないです。外部キー制約とかユニーク制約とかつけることで保証できるものももちろんありますが、全ては保証できません。データが適正かどうかはアプリケーションが決めることであってデータベースはデータを保存するだけ。

データベースで無理やり保証しようとすることもやりようによってはできるものもありますが、やめとけって話が書籍の中でされています。詳しくはP.271 衝突の実体化を参照してみてください。

DDLでデータに対する制約をつけられるようにする発展がDBの世界で行われたら、もしかするとDatabaseの責務として分離できることもあるのかもしれませんが、少なくとも2023年現在はアプリケーション側の責務であってデータベースの責務ではないですね。自分の知る限りは。

Isolation / 分離性

複数のプロセス、クライアントからアクセスされるケースでは並行処理における課題であるrace conditionが生じることがあります。ユーザー1とユーザー2が同時に同じrecordを更新しようとして、競合しちゃってどっちかの変更が失われたり…みたいなことですね。

Isolationはデータベースによって何をどこまで保証しているのかが異なる部分で、Read Committedやスナップショット分離(MVCC)、直列化可能性など、どういうアプローチを取っているのかでIsolationのレベルが変わってきます。

分離レベルが異なることに関しては、そうだねという感じですが、ACIDと一口にまとめるにはバラエティがありすぎじゃあないすかね…?

Durability / 永続性

この特性はデータが消えないよねってことを保証することです。Write-Ahead-Logとかで頑張るってやつですが、著者はハードウェアとバックアップが壊れちまったらデータベースに何かできるものでもないだろって批判をしてます。まあそうですね。

まとめ

ACIDトランザクションってやつがなんなのかを書籍の力を借りて備忘録的にまとめておきました。書籍の中では、トランザクションで気をかけるところは、AとIで、他はデータベースの責務じゃあないとまとめて、後続の説明に入っていきます。トランザクションの章は大変学びが多くてエキサイティングな章で面白く読んでよかったです。