MySQL事务的四大特性
MySQL 事务的四大特性,通常简称为 ACID 特性,是保证数据库操作正确性和可靠性的基石。它们是:
原子性
定义: 事务是最小的执行单位,不可分割。事务中的所有操作(例如多个 SQL 语句)要么全部成功执行(提交),要么全部失败回滚(撤销),就像什么都没发生过一样。
核心: “All or Nothing”。不存在部分成功的情况。
MySQL 实现: 主要依赖 Undo Log(回滚日志)。当事务需要回滚时,MySQL 利用 Undo Log 将数据恢复到事务开始前的状态。
一致性
定义: 事务的执行必须使数据库从一个一致的状态转换到另一个一致的状态。这里的“一致性”指的是数据库必须满足预定义的规则和约束(如主键约束、外键约束、唯一约束、数据类型约束、业务逻辑约束等)。
核心: 事务是数据库维护数据正确性的手段。原子性、隔离性和持久性共同保障了一致性。
MySQL 实现: 这是事务的最终目标。它通过原子性保证操作要么全做要么全不做、通过隔离性保证并发事务互不干扰、通过持久性保证结果永久保存,从而共同确保数据在任何时刻都满足定义好的规则(即一致性状态)。
隔离性
定义: 多个事务并发执行时,一个事务的执行不应影响其他事务的执行。每个事务都感觉不到系统中有其他事务在同时执行。
核心: 控制并发事务之间的可见性和影响,防止出现脏读、不可重复读、幻读等问题。
MySQL 实现: 主要依赖 锁机制 和 MVCC(多版本并发控制)。InnoDB 存储引擎默认使用 MVCC(结合 Undo Log)来提供不同级别的隔离性(如
READ COMMITTED
,REPEATABLE READ
)。锁机制(如行锁、间隙锁)也在必要时介入以保证隔离性。持久性
Redo Log: 事务提交时,其修改首先会顺序、持久化地写入 Redo Log 文件(通常先写内存缓冲区,然后按策略刷盘)。即使数据库崩溃,重启后也能根据 Redo Log 重做已提交事务的修改,确保数据不丢失。
Doublewrite Buffer: 在将脏页(修改过的数据页)写入数据文件之前,InnoDB 会先将这些页的副本写入 Doublewrite Buffer(一个位于共享表空间或独立文件的区域),然后再写入实际的数据文件位置。这主要是为了防止在写数据文件时发生部分页写入(Partial Page Write)问题(如操作系统或磁盘故障导致只写了一半页),确保数据页的完整性。如果发生部分页写入,重启后可以从 Doublewrite Buffer 恢复该页的正确副本,然后再应用 Redo Log。
定义: 一旦事务成功提交,它对数据库所做的修改就是永久性的。即使发生系统崩溃、重启或其他故障,这些修改也不会丢失。
核心: 已提交的数据必须持久存储。
MySQL 实现: 主要依赖 Redo Log(重做日志) 和 Doublewrite Buffer(双写缓冲)。
总结一下它们的关系:
原子性 (A) 是基础,确保操作单元不可分割。
隔离性 (I) 是手段,在并发环境下保证每个事务像独立执行一样。
持久性 (D) 是承诺,确保提交的结果永不丢失。
一致性 (C) 是目标,是 A、I、D 共同作用所要达到的最终状态(数据库始终符合规则)。
MySQL 的 InnoDB 存储引擎通过 Undo Log、Redo Log、锁机制和 MVCC 等精巧的设计,有效地实现了这四大 ACID 特性,为数据的安全、可靠和正确提供了强有力的保障。