mysql事务怎么实现的
在 MySQL 中,**事务(Transaction)**是为了保证数据库操作的完整性和一致性而提供的机制,它确保一组数据库操作要么全部执行成功,要么全部回滚,从而将数据库从一个一致性状态转换到另一个一致性状态。MySQL 的事务管理主要依赖于存储引擎,InnoDB 是 MySQL 的默认存储引擎并且支持事务,因此我们重点讨论 InnoDB 引擎中事务的实现。
1. 事务的ACID属性
MySQL 事务遵循 ACID 特性,用于保证事务的可靠性。ACID 是指:
-
A(Atomicity,原子性):事务是不可分割的最小操作单元,要么全部执行成功,要么全部回滚。
-
C(Consistency,一致性):事务执行前后,数据库的完整性约束没有被破坏。即使发生系统崩溃,重启后数据库也会恢复到一致的状态。
-
I(Isolation,隔离性):事务之间的操作互相独立,保证并发事务不会相互干扰。事务隔离级别决定了事务如何相互隔离。
-
D(Durability,持久性):事务一旦提交,修改的数据永久保存,即使系统崩溃,数据也不会丢失。
2. InnoDB存储引擎中的事务实现机制
InnoDB 是 MySQL 默认的事务型存储引擎,它通过一系列机制来实现事务的 ACID 特性。具体包括:
2.1 原子性(Atomicity)
原子性通过 回滚日志(Undo Log) 来实现。InnoDB 在执行事务操作时,会记录每个操作的回滚信息到 Undo Log 中。如果事务失败或显式调用 ROLLBACK,则可以根据 Undo Log 将数据回滚至事务开始之前的状态。
Undo Log 的工作原理:
- 在执行更新操作之前,InnoDB 会将被修改的原始数据保存到 Undo Log 中。
- 如果事务执行失败,InnoDB 根据 Undo Log 中的记录将数据恢复到之前的状态,从而实现回滚操作。
例子:
START TRANSACTION;
UPDATE users SET balance = balance - 100 WHERE user_id = 1;
UPDATE users SET balance = balance + 100 WHERE user_id = 2;
ROLLBACK;
在 ROLLBACK 之前,InnoDB 会把每次 UPDATE 操作的原始数据写入 Undo Log,并在回滚时利用这些日志恢复数据。
2.2 一致性(Consistency)
一致性是事务的最终目的,InnoDB 通过事务的原子性、隔离性和持久性等机制来保证数据库能从一个一致性状态转换到另一个一致性状态。InnoDB 提供了多种完整性约束(如外键、唯一性约束等),确保事务在执行过程中不会破坏数据的完整性。
例如,假设有一个转账操作,A 账户转账 100 元给 B 账户。事务保证无论发生什么情况,要么 A 和 B 账户的余额都被正确更新,要么都不更新。
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
COMMIT;
如果事务在执行过程中失败(如电源故障或应用程序异常),一致性确保不会出现 A 账户扣了 100 元而 B 账户没有增加 100 元的情况。
2.3 隔离性(Isolation)
隔离性通过事务的隔离级别来控制,MySQL 支持四种事务隔离级别:
- 读未提交(READ UNCOMMITTED):事务中的修改,即使尚未提交,其他事务也能看到。
- 读已提交(READ COMMITTED):一个事务只能看到已经提交的事务所做的修改。
- 可重复读(REPEATABLE READ):在事务开始之后,看到的数据不会因为其他事务的提交而发生变化;这是 MySQL InnoDB 的默认隔离级别。
- 串行化(SERIALIZABLE):强制事务按顺序执行,避免并发,最严格但性能最差。
InnoDB 通过**多版本并发控制(MVCC,Multiversion Concurrency Control)**实现了隔离级别中的可重复读和读已提交。
MVCC 的工作原理:
- 每个事务在开始时会获取一个快照,只能够看到在此时刻之前已经提交的事务修改。
- InnoDB 通过为每一行记录分配两个隐藏的版本号(事务 ID),分别表示该行记录的创建和删除时间(即事务的开始和结束时间)。
- 在读取数据时,InnoDB 通过比对当前事务的版本号与数据行的版本号,确保读取到的是符合隔离级别定义的数据。
2.4 持久性(Durability)
持久性通过 重做日志(Redo Log) 来实现。事务提交时,InnoDB 会先将修改操作记录到 Redo Log 中,然后再写入磁盘。这种机制确保即使发生系统崩溃或断电,事务的修改也不会丢失。
Redo Log 的工作原理:
- 当事务执行时,修改操作会先记录到 Redo Log 中,而不是立即写入磁盘。这种方式称为预写日志(Write-Ahead Logging, WAL)。
- Redo Log 是顺序写入的,效率高。在系统崩溃后,InnoDB 可以通过 Redo Log 进行恢复,把未完成的事务重新提交。
- 事务提交后,InnoDB 会确保 Redo Log 已经写入磁盘并且持久化,然后才真正将修改同步到磁盘中的数据文件。
持久性保障机制:
- 日志同步机制:InnoDB 提供了
innodb_flush_log_at_trx_commit参数来控制 Redo Log 的刷盘策略:1:每次事务提交时,Redo Log 都会持久化到磁盘,保证最强的持久性。2:每次事务提交时,Redo Log 会写入文件系统缓存,而不强制写入磁盘。0:事务提交时不会立即写入 Redo Log,而是由后台线程定期将日志写入磁盘。
3. MySQL 事务的实现流程
以 InnoDB 为例,事务的大致执行流程如下:
-
事务开始:
- 当执行
START TRANSACTION时,InnoDB 会为该事务分配一个唯一的事务 ID。 - InnoDB 创建一个快照(如果是可重复读或读已提交隔离级别),用于保证数据的一致性视图。
- 当执行
-
执行修改操作:
- 在执行
INSERT、UPDATE或DELETE操作时,InnoDB 会生成 Undo Log 和 Redo Log。Undo Log 用于回滚,Redo Log 用于恢复。 - 这些修改首先会应用到缓冲池(内存中的数据页),然后生成日志(Undo Log 和 Redo Log)。
- 在执行
-
提交事务:
- 当执行
COMMIT时,InnoDB 会将该事务的 Redo Log 写入磁盘,确保事务持久化。 - 如果
innodb_flush_log_at_trx_commit参数设置为1,则 Redo Log 会立即刷盘,否则可能会延迟写入。 - 提交完成后,事务的修改会持久保存,即使系统崩溃也不会丢失。
- 当执行
-
回滚事务:
- 如果执行
ROLLBACK,InnoDB 会根据 Undo Log 将数据恢复到事务开始前的状态,撤销所有未提交的修改。
- 如果执行
-
崩溃恢复:
- 当系统崩溃后,InnoDB 会利用 Redo Log 进行恢复,重放未完成的事务日志,确保所有已提交的事务最终应用到数据文件中。
- 同时,InnoDB 会根据 Undo Log 撤销未提交的事务,确保数据的一致性。
4. 事务隔离级别与并发问题
不同的事务隔离级别会影响数据库的并发行为,常见的并发问题包括:
- 脏读(Dirty Read):一个事务读取了另一个事务尚未提交的数据。
- 不可重复读(Non-repeatable Read):在一个事务中,两次读取同一数据得到的结果不一致,因为另一个事务在中间修改并提交了数据。
- 幻读(Phantom Read):在一个事务中,两次查询同一条件的数据集,结果集的行数不一致。因为另一个事务在中间插入或删除了数据。
InnoDB 通过不同的事务隔离级别来解决这些问题:
- 读未提交(READ UNCOMMITTED):允许脏读、不可重复读和幻读。
- 读已提交(READ COMMITTED):解决脏读,但仍然允许不可重复读和幻读。
- 可重复读(REPEATABLE READ):解决脏读和不可重复读,但可能出现幻读。MySQL 的 InnoDB 引擎通过 MVCC 解决了幻读问题,因此在 MySQL 中可重复读隔离级别也能避免幻读。
- 串行化(SERIALIZABLE):通过加锁的方式解决所有并发问题,但性能最差。
5. 总结
MySQL 中的事务主要通过 InnoDB 存储引擎来实现,而 InnoDB 通过以下几种机制来保证事务的 ACID 特性:
- 原子性(Atomicity):通过 Undo Log 实现,保证事务的回滚功能。
- 一致性(Consistency):通过事务的原子性、隔离性和持久性,以及数据库的完整性约束来保证。
- 隔离性(Isolation):通过不同的事务隔离级别和 MVCC(多版本并发控制)来实现并发事务的隔离。
- 持久性(Durability):通过 Redo Log 实现,确保事务提交后即使系统崩溃数据也能恢复。
这些机制共同作用,确保 MySQL 在支持高并发的同时,能够保证数据的完整性与一致性。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)