ACID 是数据库事务(Transaction)的四大核心特性,用于保证数据库操作的可靠性和一致性,是关系型数据库(如 MySQL、PostgreSQL)实现事务管理的基础。ACID 分别对应 **原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)**。
一、ACID 四大特性详解
1. 原子性(Atomicity)
- 定义:事务是一个“不可分割的最小操作单元”,事务中的所有操作要么全部成功执行,要么全部失败回滚,不会出现“部分成功、部分失败”的中间状态。
- 示例:转账场景中,“A 账户扣减 100 元”和“B 账户增加 100 元”是一个事务的两个操作。若 A 扣减成功但 B 增加失败,事务会回滚到初始状态(A 账户不变),避免出现“钱凭空消失”的问题。
- 实现原理:数据库通过“日志(Undo Log)”记录事务执行前的状态,若事务失败,通过 Undo Log 回滚到操作前的状态。
2. 一致性(Consistency)
- 定义:事务执行前后,数据库的状态必须从一个“合法状态”转换到另一个“合法状态”,即满足预设的业务规则和约束(如主键唯一、字段非空、余额不为负等)。
- 示例:转账前 A 有 500 元、B 有 300 元,总金额 800 元;转账后 A 有 400 元、B 有 400 元,总金额仍为 800 元,符合“总金额不变”的业务规则。若事务执行后总金额异常(如 700 元),则违反一致性。
- 注意:一致性是最终目标,原子性、隔离性、持久性是实现一致性的手段。
3. 隔离性(Isolation)
- 定义:当多个事务同时操作数据库时,每个事务的执行应“不受其他事务干扰”,事务之间的操作相互隔离,避免因并发执行导致的数据不一致(如脏读、不可重复读、幻读)。
- 数据库隔离级别(从低到高,安全性递增,性能递减):
- 读未提交(Read Uncommitted):一个事务可读取另一个未提交的事务数据(可能出现脏读)。
- 读已提交(Read Committed):一个事务只能读取另一个已提交的事务数据(解决脏读,可能出现不可重复读)。
- 可重复读(Repeatable Read):事务执行期间,多次读取同一数据的结果一致(解决不可重复读,MySQL 默认级别,通过 MVCC 实现)。
- 串行化(Serializable):事务串行执行(不并发),完全隔离(解决所有并发问题,但性能极低)。
- 示例:若隔离性不足,可能出现“事务 A 读取到事务 B 未提交的临时数据(脏读)”,导致业务判断错误。
4. 持久性(Durability)
- 定义:一旦事务提交成功,其对数据库的修改将永久保存,即使后续数据库发生故障(如断电、崩溃),修改也不会丢失。
- 实现原理:数据库通过“重做日志(Redo Log)”记录事务提交后的修改,事务提交时会将 Redo Log 持久化到磁盘。即使数据库崩溃,重启后可通过 Redo Log 恢复已提交的修改。
- 示例:订单创建事务提交后,即使数据库立即断电,重启后订单记录仍存在。
二、ACID 特性的关系
- 原子性保证事务操作“要么全成,要么全败”;
- 隔离性保证并发事务之间“互不干扰”;
- 持久性保证事务结果“永久有效”;
- 三者共同作用,最终实现事务的一致性(核心目标)。
总结
ACID 是关系型数据库事务可靠性的基石:
- 原子性(Atomicity):操作不可分割;
- 一致性(Consistency):数据状态合法;
- 隔离性(Isolation):并发互不干扰;
- 持久性(Durability):结果永久保存。
理解 ACID 有助于设计可靠的业务逻辑(如支付、订单等核心场景),并在分布式系统中合理选择事务方案(如 2PC、TCC 等)。