一、MySQL 存储引擎对事务的支持

InnoDB:默认且最常用的存储引擎,支持事务。其事务实现主要依赖于 UNDO 日志和 REDO 日志。

MyISAM:不支持事务。强调高速插入和检索,但不提供原子性、一致性等事务保障。

BDB:支持事务,但现在已很少使用。

 

二、核心日志机制

1.  UNDO Log (回滚日志)

作用:用于事务回滚和多版本并发控制 (MVCC)。它记录了事务执行前数据的旧版本。

工作流程:当事务需要回滚(执行 `ROLLBACK`)或其它事务需要读取数据的历史版本时,可以通过 UNDO Log 将数据恢复到修改前的状态。

 

2.  REDO Log (重做日志)

    作用:用于保证事务的持久性 (Durability)。它记录了事务执行后数据的新版本,即对数据页的物理修改。

    工作流程:事务提交时,首先会将所有修改信息按顺序写入 REDO Log 并进行持久化(fsync),然后再更新内存中的数据页。即使系统在写入数据页前崩溃,重启后 MySQL 也可以通过重放 REDO Log 来重新执行已提交的事务,确保数据不丢失。这是一种 Write-Ahead Logging (WAL) 技术。

 

三、事务控制语句与工作流程

默认情况下,MySQL 处于自动提交 (autocommit) 模式,每条 SQL 语句都会被视为一个独立的事务并在执行后立即提交。要显式地控制事务,需要先关闭自动提交或使用事务控制语句。

1.  开启事务

    BEGIN;

    

    START TRANSACTION;

       标记一个事务的起点,后续的所有 SQL 语句都将在此事务中执行。

 

2.  提交事务

    COMMIT;

       将事务中对数据库的所有更新永久化到磁盘,标志着事务的成功结束。执行后,所有更改生效,且无法回滚。

 

3.  回滚事务

    ROLLBACK;

       撤销事务中进行的所有操作,将数据恢复到事务开始前的状态。用于在发生错误时中止事务。

 

工作流程总结:

`BEGIN` -> 执行多条 DML 语句 (INSERT/UPDATE/DELETE) -> 如果所有操作成功 -> `COMMIT`;如果中途遇到任何错误 -> `ROLLBACK`。

 

四、实例演示回顾与解析

您的例子完美地演示了隔离性和原子性。

示例1 (成功提交):

    A窗口:`BEGIN` -> `UPDATE 张三` -> `UPDATE 李四` -> `COMMIT`

    B窗口的查询现象:在 A 窗口 `COMMIT` 之前,B 窗口查不到 A 窗口未提交的更改。这展示了隔离性——一个事务的中间状态对其它事务是不可见的。`COMMIT` 后,B 窗口看到了全部更新,并且总额不变,体现了一致性。

 

示例2 (失败回滚):

       `BEGIN` -> `UPDATE 张三 (余额变为负数)` -> `ROLLBACK`

       通过 `ROLLBACK`,无效的更新被撤销,数据恢复到事务开始前的状态。这强力地保证了原子性——事务中的所有操作是一个整体。

 

五、重要注意事项(非常重要!)

1.  事务要尽可能短小

       事务会持有数据库的锁等资源,长时间的事务会阻塞其他操作,严重影响数据库的并发性能和响应速度。不要在事务中包含网络请求、文件IO或等待用户输入等耗时操作。

 

2.  访问数据量要尽量最少

       事务中操作的数据越少,事务之间发生锁竞争的可能性就越低,系统并发度越高。

 

3.  避免在事务中进行只读查询

       简单的数据浏览查询(SELECT)应尽量不使用事务,或者使用只读事务(`START TRANSACTION READ ONLY`)以减少不必要的资源占用。

 

4.  理解隔离级别

       如您所拓展的,隔离级别决定了事务之间的“隔离”程度。默认的可重复读 (REPEATABLE-READ)*级别在大多数情况下能提供良好的并发性和一致性保证。但在特定业务场景下(如极高并发),可能需要调整隔离级别来平衡性能和数据一致性要求。《MySQL事务隔离级别》是深入学习的必备内容。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)