标准答案
- 原子性要求一组操作要么全部成功,要么失败后全部回滚,例如扣库存和创建订单不能只完成其中一步。
- 一致性表示事务前后满足定义好的约束和业务不变量,例如余额不为负、唯一订单号不重复;数据库不会自动理解所有业务规则。
- 隔离性处理并发事务之间的相互影响,避免读到不该看到的中间状态或发生不可解释的覆盖。
- 持久性表示提交确认后,即使进程或机器故障,数据也能通过日志、刷盘和恢复机制保留。
- 事务边界要小且明确,不能把远程调用、用户等待或长时间计算包在数据库事务里。
题目解析
ACID 不是“加了事务就一定正确”。例如两个事务都先读取库存再各自扣减,若没有合适的隔离级别、条件更新或锁,仍可能超卖。应用需要把业务不变量明确写成约束、条件和事务内操作。
持久性也不是绝对瞬时不丢失,它取决于日志策略、复制、存储介质和确认语义。高可用系统还要区分本地提交、复制确认和灾难恢复目标。
常见误区
- 把一致性理解成多个服务立刻一致,混淆数据库事务与分布式一致性。
- 在事务中调用慢 HTTP 接口,导致锁持有时间和失败范围不断扩大。