前言
事务(Transaction)是数据库管理系统(DBMS)中执行逻辑工作单元的基本单位,它包含一组操作序列。为了确保数据库在并发执行和系统故障的情况下仍能保持数据的一致性和可靠性,事务必须满足 ACID 特性。
ACID特性详解
1. 原子性 (Atomicity)
**定义:**事务被视为一个不可分割的最小工作单元,事务中的所有操作要么全部成功(提交),要么全部失败(回滚)。
**核心机制:**Undo Log(回滚日志)。DBMS 在执行事务修改前,先将原始数据备份到 Undo Log 中。如果事务执行失败或用户主动回滚,系统利用 Undo Log 将数据恢复到事务开始前的状态。
**通俗理解:**转账操作(A 扣钱,B 加钱)必须作为一个整体。如果 A 扣钱成功但 B 加钱失败,系统必须撤销 A 的扣款,就像什么都没发生过一样。
2. 一致性 (Consistency)
**定义:**事务执行的结果必须使数据库从一个一致性状态转换到另一个一致性状态。一致性状态是指数据满足预定义的完整性约束(如主键唯一、外键约束、用户自定义业务规则)。
**核心机制:**由应用程序和数据库约束共同保证。原子性、隔离性和持久性是数据库系统提供的技术手段,而一致性是最终目的。
**通俗理解:**转账前后,A 和 B 的账户总额必须保持不变。如果总额变了,就破坏了一致性。
3. 隔离性 (Isolation)
**定义:**多个事务并发执行时,一个事务的执行不应影响其他事务的执行,且各事务之间感觉不到彼此的干扰。
**核心机制:**锁机制 和 多版本并发控制 (MVCC)。通过设置不同的隔离级别(Read Uncommitted, Read Committed, Repeatable Read, Serializable)来控制并发事务之间的可见性。
**通俗理解:**两个同时进行的转账事务(A->B 和 C->D)互不干扰,不会出现 A 看到 C 转了一半钱的情况。
4. 持久性 (Durability)
**定义:**一旦事务提交成功,它对数据库的修改就是永久性的,即使系统发生宕机、断电等故障,数据也不会丢失。
**核心机制:**Redo Log(重做日志)。事务提交时,先将修改操作记录到 Redo Log 中并刷盘。当数据库重启恢复时,重放 Redo Log 中已提交但未写入数据文件的操作,确保数据不丢失。
**通俗理解:**转账成功提示弹出后,这笔钱就确定到账了,服务器重启后数据依然存在。
四者关系
**AID 是手段,C 是目的:**原子性、隔离性和持久性是为了在技术层面保证数据库最终达到一致性状态。
**相互依赖:**如果没有原子性,部分失败会导致数据不一致;如果没有隔离性,并发操作会破坏一致性;如果没有持久性,已提交的数据丢失也会破坏一致性。
