四个维度各管什么
原子性要求事务受保护的修改共同完成或撤销;持久性要求已确认提交的效果能够承受所规定故障。前者关注半途失败留下什么,后者关注完成以后还能保存什么。
一致性要求事务维持适用的数据约束和业务规则,隔离性则约束并发事务之间允许出现的干扰。数据库可以执行声明的约束,应用仍须正确表达转账、库存等业务规则及事务边界。
保证由多种机制落实
日志与恢复帮助实现撤销或重做,锁、多版本及冲突检测处理并发,非空、唯一与外键等约束限制可接受数据。它们分别承担任务,不能把某一种日志方案直接等同完整ACID。
实际产品还提供不同隔离和提交模式。例如PostgreSQL的Read Committed不承诺所有事务都可串行化,异步提交也可能在崩溃时损失刚确认的事务。使用时应核对具体配置,而不是只看产品宣传标签。
一致性与外部世界的边界
ACID中的一致性不表示资料一定符合现实,也不等同于分布式副本之间的每一种一致性模型。错误规则、错误输入或漏掉的一次业务检查,仍可能产生语法和约束都允许的错误结果。
单个数据库里的事务,也不会自动把远端接口和已发送通知纳入共同撤销范围。系统设计须说明哪些资源参加事务、哪些效果在提交后触发,以及失败和重试如何协调;四个性质提供问题框架,不能替代这些具体约定。