MySQL 中的事务实现主要依赖于 存储引擎,而 InnoDB 是 MySQL 最常用的支持事务的存储引擎。InnoDB 通过以下机制来实现事务的 ACID 特性(原子性、一致性、隔离性、持久性):
1. 原子性(Atomicity)
- 定义:事务中的所有操作要么全部成功,要么全部失败。
- 实现机制:
- Undo Log(回滚日志):
- 当事务对数据进行修改时,InnoDB 会先将旧数据写入 Undo Log。
- 如果事务回滚,InnoDB 会使用 Undo Log 中的旧数据恢复原始状态。
- 如果事务提交,Undo Log 中的旧数据会在不再需要时被清理。
- Undo Log(回滚日志):
2. 一致性(Consistency)
- 定义:事务执行前后,数据库的状态必须保持一致。
- 实现机制:
- 约束和触发器:
- 数据库通过主键、外键、唯一约束等保证数据的一致性。
- 事务的原子性、隔离性和持久性:
- 一致性是事务的最终目标,依赖于其他三个特性(原子性、隔离性、持久性)的共同保障。
- 约束和触发器:
3. 隔离性(Isolation)
- 定义:多个并发事务之间相互隔离,互不干扰。
- 实现机制:
- 锁机制:
- InnoDB 使用行级锁(共享锁、排他锁)来控制并发事务对数据的访问。
- 写操作会加排他锁,读操作可以加共享锁。
- MVCC(多版本并发控制):
- MVCC 通过为每个事务提供一致性视图(Read View)来实现隔离性。
- 每个事务在启动时会创建一个 Read View,用于判断哪些数据版本对当前事务可见。
- 读操作不需要加锁,通过版本链读取合适的数据版本,避免了读写冲突。
- 锁机制:
4. 持久性(Durability)
- 定义:事务提交后,对数据的修改是永久性的,即使系统崩溃也不会丢失。
- 实现机制:
- Redo Log(重做日志):
- 当事务对数据进行修改时,InnoDB 会先将修改操作记录到 Redo Log 中。
- Redo Log 是顺序写入的,性能较高。
- 如果系统崩溃,InnoDB 在重启时会使用 Redo Log 恢复未写入磁盘的数据。
- Double Write Buffer(双写缓冲):
- 为了防止数据页写入磁盘时发生部分写(Partial Write)问题,InnoDB 使用 Double Write Buffer。
- 数据页先写入 Double Write Buffer,再写入磁盘,确保数据的完整性。
- Redo Log(重做日志):
事务的实现流程
- 事务开始:
- 使用
BEGIN
或START TRANSACTION
语句显式开启事务。 - 事务启动时会分配一个唯一的事务 ID(Transaction ID)。
- 使用
- 数据修改:
- 事务对数据进行修改时,InnoDB 会:
- 将旧数据写入 Undo Log。
- 将修改操作记录到 Redo Log。
- 对修改的数据加锁(如行锁)。
- 事务对数据进行修改时,InnoDB 会:
- 事务提交:
- 使用
COMMIT
语句提交事务。 - InnoDB 会:
- 将 Redo Log 中的修改操作持久化到磁盘。
- 释放事务持有的锁。
- 清理 Undo Log 中不再需要的旧数据版本。
- 使用
- 事务回滚:
- 使用
ROLLBACK
语句回滚事务。 - InnoDB 会:
- 使用 Undo Log 中的旧数据恢复原始状态。
- 释放事务持有的锁。
- 清理 Redo Log 中的修改记录。
- 使用
事务的隔离级别
MySQL 支持四种事务隔离级别,InnoDB 通过 MVCC 和锁机制来实现这些隔离级别:
- 读未提交(Read Uncommitted):
- 事务可以读取其他事务未提交的数据。
- 通过不加锁直接读取最新数据实现。
- 读已提交(Read Committed):
- 事务只能读取其他事务已提交的数据。
- 通过每次读取时生成新的 Read View 实现。
- 可重复读(Repeatable Read):
- 事务在执行期间多次读取同一数据时,结果一致。
- 通过事务启动时生成一个 Read View 实现。
- 串行化(Serializable):
- 事务完全串行执行,避免所有并发问题。
- 通过加锁实现。
总结
MySQL 通过 InnoDB 存储引擎实现了事务的 ACID 特性:
- 原子性 通过 Undo Log 实现。
- 一致性 通过约束、触发器和其他 ACID 特性共同保障。
- 隔离性 通过锁机制和 MVCC 实现。
- 持久性 通过 Redo Log 和 Double Write Buffer 实现。
事务的实现依赖于多种日志和机制(如 Undo Log、Redo Log、MVCC、锁机制等),这些机制共同确保了事务的可靠性和高性能。
THE END
暂无评论内容