博客
关于我
【mysql】事务隔离与mvcc的误区
阅读量:375 次
发布时间:2019-03-05

本文共 976 字,大约阅读时间需要 3 分钟。

问题:MySQL InnoDB 事务隔离机制的误区

在使用 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;
    • 提交事务 B。
    COMMIT;
  • 在事务 A 中执行查询

    由于事务 A 的 BEGIN 语句尚未执行任何 DML 语句,事务 ID 还未生成。此时,在事务 A 中执行查询:

    SELECT * FROM course;

    结果:查询结果显示 语文01,而不是原来的 语文。这表明,BEGIN 语句并未立即开启事务,只有在执行第一条 DML 语句时,事务才会真正启动,并生成事务 ID。

  • 结论

    通过上述验证可以看出,BEGIN 语句不会立即开启事务。事务的启动仅在实际执行 DML 语句时才会发生。这种设计保证了在多用户并发访问的环境下,读取到的数据是最新且一致的。

    转载地址:http://ihtwz.baihongyu.com/

    你可能感兴趣的文章
    firefox中angular2嵌套发送请求问题
    查看>>
    Netty 知识整理 (2)HttpServerCodec和HttpObjectAggregator用法
    查看>>
    【Linux】service命令
    查看>>
    【mysql】事务隔离与mvcc的误区
    查看>>
    【mybatis3】调试/断点打印日志
    查看>>
    Leetcode 102题.从中序与后序遍历序列构造二叉树
    查看>>
    C++
    查看>>
    [CTFSHOW]PHP特性
    查看>>
    navigator对象
    查看>>
    程序员面试防坑宝典,带你手撸红黑树,一文轻松搞定
    查看>>
    关于EFI系统分区(ESP)你应该知道的3件事
    查看>>
    题目总结 web 51-100
    查看>>
    5.Mybatis复杂映射开发
    查看>>
    Servlet2.5的增删改查功能分析与实现------删除功能(四)
    查看>>
    环境配置 jdk_mysql_myeclipse8.6
    查看>>
    Session验证码的实现(2018-7-3)
    查看>>
    spring启动错误:Could not resolve placeholder
    查看>>
    日志写入xml上传ftp遇到的问题
    查看>>
    Eclipse中serverRuntime Environment中没有Tomcat选项
    查看>>
    下载任意版本vmware对应的vmware tools
    查看>>