MySQL可重复读隔离级别下开启事务的问题解决

 更新时间:2024年07月21日 15:34:07   作者:雨下的竹子  
本文主要介绍了MySQL可重复读隔离级别下开启事务的问题解决,详解在Repeatable Read隔离级别下,mysql的快照生成时机的问题,感兴趣的可以了解一下

1.前言

在日常我们操作mysql时,mysql默认是自动提交的。当我们需要开启一个事务时,可以使用start transactionbegin命令,再使用commitrollback提交或回滚事务。

但事务的使用也有一些注意事项,不注意的话,可能会带来意料之外的结果。

今天,我要分享的就是在Repeatable Read(简称rr)隔离级别下,mysql的快照生成时机的问题。

2.问题引出

我们都知道,rr级别下,是根据快照来读取数据的,所以他能保证同一事务内的两次读取是一致的,不会因为其他事务提交的修改而导致前后读取结果不一样。

现在db3库下有个test表,且mysql隔离级别为rr(默认rr)。

在这里插入图片描述

开启两个会话,一个会话开启一个事务,另一个会话开启一个事务并修改一行数据

在这里插入图片描述

在这里插入图片描述

按正常理解来说,此时在第一个会话里查询数据,查询到的还是原来的’zhuzi1’而不是’zhuzin’

但实际上,我们却发现,第二个事务的修改影响到了第一个事务的结果。

在这里插入图片描述

3.原因

上面问题出现的原因,就是因为我们在开启一个事务时,并没有立即生成数据快照,而是在执行一次快照读(所谓快照读,就是我们平常使用的普通查询;当前读则是使用例如for update加锁的查询)之后才生成的。所以,当我们在第一个事务中第一次执行快照读时,第二个事务已经提交修改了,当然是可以看到这个修改的。

mysql想要在开启事务时就生成快照,确保数据不再变化,可以使用如下方式开启事务

start transaction with consistent snapshot;

这样,mysql就会在开启事务时立即生成快照了。

官网对于with consistent snapshot的介绍如下:

在这里插入图片描述

翻译的大致意思就是WITH CONSISTENT SNAPSHOT修饰符为innodb启动一致读取。且只适用于innodb引擎。其效果与从任何InnoDB表中发出START TRANSACTION后接SELECT相同。WITH CONSISTENT SNAPSHOT修饰符不会更改当前事务隔离级别,因此只有当前隔离级别允许一致读取时,它才能提供一致的快照。唯一允许一致读取的隔离级别是可重复读取。对于所有其他隔离级别,WITH CONSISTENT SNAPSHOT子句将被忽略。忽略WITH CONSISTENT SNAPSHOT子句时会生成警告。

官网对rr的介绍如下:

在这里插入图片描述

由此可知,如果你开启了一个事务,却不进行一次读取操作,那么快照是不会建立的

到此这篇关于MySQL可重复读隔离级别下开启事务的一个注意事项的文章就介绍到这了,更多相关MySQL可重复读隔离开启事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • MySQL sleep函数使用方法详解

    MySQL sleep函数使用方法详解

    sleep函数时「延时」指定时间(单位秒),也就是让程序停止执行一段指定的时间,本文就给大家简单的介绍一下MySQL sleep函数使用方法,需要的朋友可以参考下
    2023-07-07
  • MySQL中LIKE子句相关使用的学习教程

    MySQL中LIKE子句相关使用的学习教程

    这篇文章主要介绍了MySQL中LIKE子句相关使用的学习教程,LIKE子句一般用于WHERE语句中,需要的朋友可以参考下
    2015-12-12
  • 一次MySQL启动导致的事故实战记录

    一次MySQL启动导致的事故实战记录

    这篇文章主要给大家介绍了一次MySQL启动导致的事故实战记录,记录了MySQL 启动成功但未监听端口的解决方法,文中给出了详细的解决方法,需要的朋友可以参考下
    2021-09-09
  • CentOS7下mysql 8.0.16 安装配置方法图文教程

    CentOS7下mysql 8.0.16 安装配置方法图文教程

    这篇文章主要为大家详细介绍了CentOS7下mysql 8.0.16 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • MySQL连接异常报10061错误问题解决

    MySQL连接异常报10061错误问题解决

    这篇文章主要介绍了MySQL连接异常报10061错误问题解决,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • 使用FriendFeed来提升MySQL性能的方法

    使用FriendFeed来提升MySQL性能的方法

    这篇文章主要介绍了使用FriendFeed来提升MySQL性能的方法,用其来存储无模式的数据从而能够维护索引,需要的朋友可以参考下
    2015-06-06
  • MySQL 5.7.29 + Win64 解压版 安装教程图文详解

    MySQL 5.7.29 + Win64 解压版 安装教程图文详解

    这篇文章主要介绍了MySQL 5.7.29 + Win64 解压版 安装教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 深入解析MySQL索引的原理与优化策略

    深入解析MySQL索引的原理与优化策略

    MySQL索引是一种用于加速数据库查询的数据结构,它类似于书籍的目录,能够快速指导我们找到需要的信息。本文将带你介绍MySQL索引的原理与优化策略,感兴趣的小伙伴可以参考阅读
    2023-03-03
  • MySQL外键约束(FOREIGN KEY)的具体使用

    MySQL外键约束(FOREIGN KEY)的具体使用

    MySQL外键约束是表的一个特殊字段,经常与主键约束一起使用,本文主要介绍了MySQL外键约束(FOREIGN KEY)的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-05-05
  • MySQL超详细安装配置超详细图文教程(亲测有效)

    MySQL超详细安装配置超详细图文教程(亲测有效)

    这篇文章详细介绍了如何下载、配置和安装MySQL,包括设置环境变量、初始化my.ini文件、开启MySQL服务以及设置密码,此外,还介绍了如何使用Navicat工具连接MySQL数据库,感兴趣的朋友跟随小编一起看看吧
    2024-11-11

最新评论