本文共 976 字,大约阅读时间需要 3 分钟。
在使用 MySQL 的 InnoDB 存储引擎时,许多开发者对事务隔离机制有着误解。特别是在可重复读(REPEATABLE READ
)模式下,事务的记录机制通过事务 ID 实现。然而,一个常见的误区是:BEGIN
语句是否会立即开启一个事务?
事实上,BEGIN
语句并不会立即开启事务。真正的事务启动仅在执行 SELECT
语句或其他 DML 语句时才会触发。事务 ID 的生成和记录也仅在第一条语句被执行时完成。这一机制的设计目的是为了在多个并发事务环境下,确保读取到的数据是最新且一致的。
为了更直观地理解这一点,我们可以通过以下步骤进行验证:
创建一个课程表
首先,我们创建一个简单的课程表,字段包括ID
、课程名称
和 课程描述
。CREATE TABLE course ( ID INT PRIMARY KEY AUTO_INCREMENT, course_name VARCHAR(255) NOT NULL, description TEXT);
开启事务 A,但未执行任何语句
在 MySQL 中,使用BEGIN
语句开启事务不会立即记录事务 ID。mysql> BEGIN;Query OK, 0 rows affected (0.00 sec)
此时,事务 ID 还未生成。
事务 B 修改数据并提交
在另一个连接中,执行以下操作:语文01
。UPDATE course SET course_name = '语文01' WHERE ID = 1;
COMMIT;
在事务 A 中执行查询
由于事务 A 的BEGIN
语句尚未执行任何 DML 语句,事务 ID 还未生成。此时,在事务 A 中执行查询:SELECT * FROM course;
结果:查询结果显示 语文01
,而不是原来的 语文
。这表明,BEGIN
语句并未立即开启事务,只有在执行第一条 DML 语句时,事务才会真正启动,并生成事务 ID。
通过上述验证可以看出,BEGIN
语句不会立即开启事务。事务的启动仅在实际执行 DML 语句时才会发生。这种设计保证了在多用户并发访问的环境下,读取到的数据是最新且一致的。
转载地址:http://ihtwz.baihongyu.com/