ACID とは
DBのトランザクションが満たすべき性質をまとめた言葉。
原子生(Atomicity)、一貫性(Consistency)、分離性(Isolation)、持続性(Durability)の頭文字から命名されている。
それぞれの性質について説明していく
原子生(Atomicity)
ある物事が、それ以上細かい単位に分割されない性質
例としては
ユーザーの所持金を追加して、履歴にも記録する。
これらの操作の途中でエラーが発生して、所持金は追加したけど、履歴には記録されてないなんて最悪ですね
全部成功するか、全部失敗するか、どちらかにして欲しい
別々の作業として分解せず、これらの操作をまとめて行って欲しい
トランザクションには原子性が必要
一貫性(Consistency)
トランザクションの前後で、あらかじめ与えられたルールを満たすことを保証する性質
例としては、
ユーザーが金を使おうとしたけど足りなかった場合
所持金がマイナスで記録されるのではなく、エラーになるべき
トランザクションには一貫性が必要
持続性(Durability)
トランザクションが完了した時点で、結果が永続的になること
トランザクションが完了した後ならば、エラーが起きてもデータが消えたり変わったりしないこと
トランザクションには持続性が必要
分離性(Isolation)
トランザクション中に行われる操作の過程が他の操作から分離していること
例としては、
ユーザーに1万円プレゼントする場合
1.ユーザーの所持金が5万円なのを確認する
2.ユーザーの所持金を6万円に更新する
正常終了
1と2の間のタイミングで、2万円プレゼントされた場合
1.ユーザーの所持金が5万円なのを確認する
割り込みが発生
ユーザーの所持金が5万円なのを確認する
ユーザーの所持金を7万円に更新する
2.(割り込みがあったことを知らないので)ユーザーの所持金を6万円に更新する
本当は3万円貰えたはずが1万円しか増えていない……!
割り込みを発生させないように、それぞれの操作を分離させる必要がある
トランザクションには分離性が必要
だが、分離性を完璧に保つと遅くなってしまい実用に耐えられない
MySQL はどのくらいまで完璧に分離させるかを選ぶことができる
分離レベルを低くしていても、他から変更されないように特定の行やテーブルのロックを制御できる
参考
Wikipediaの ACID の記事
MySQL の ACID の記事