首页 > 数据库 >MySQL幻读详解及解决方法

MySQL幻读详解及解决方法

时间:2022-11-04 12:14:34浏览次数:62  
标签:事务 记录 幻读 T2 T1 详解 MySQL id

原文网址:https://blog.csdn.net/weixin_43207025/article/details/115412974

1. 什么是幻读?
建立一张表如下:

 

 

 

按照下面步骤执行两个事务。

事务1:

 

 

 

事务2:

 

 

 

由此,可以把幻读理解为:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

2. 解决幻读
2.1 RR(可重复读)级别下防止幻读
RR级别下只要对SELECT操作手动加**排他锁(X锁)**即可实现类似SERIALIZABLE级别(会对SELECT隐式加锁),代码如下:

# 这里需要用 X锁, 用 LOCK IN SHARE MODE 拿到 S锁 后我们没办法做 写操作
SELECT `id` FROM `users` WHERE `id` = 1 FOR UPDATE;
1
2
这里id=3的记录不存在,FOR UPDATE也对此记录加锁。InnoDB 的行锁(gap锁是范围行锁,一样的)锁定的是记录所对应的索引,且聚簇索引同记录是直接关系在一起的。

T1事务

 

 

 

T2事务

 

 

 

id = 3 的记录不存在,开始执行事务

step.1 :T1事务 查询id = 3的记录,并对其加X锁

step.2 :T2事务 插入id = 3的记录,但是会被阻塞

step.3 :T1事务 插入 id= 3的记录,成功执行,但此时T2事务依然被阻塞,直到T1提交事务后,T2才被唤醒,但主键冲突报错。

T1事务最终被成功执行,T2事务干扰T1事务失败。

2.2 SERIALIZABLE级别杜绝幻读
在此级别下,我们便不需要对 SELECT 操作显式加锁,InnoDB会自动加锁,事务安全,但性能很低。

先修改数据库隔离级别:MySQL8查询事务应该使用transaction_isolation,tx_isolation在MySQL 5.7.20后被弃用。

 

 

 

设置数据库隔离级别为SERIALIZABLE,左边是事务T1,右边是事务T2.

step.1:T1查询id=4的记录是空, Innodb隐式对其加X锁。

step.2:T2向表中插入id=4的记录,被阻塞

step.3:T1向表中插入id=4的记录,成功执行(此时T1仍然被阻塞)

接着,提交T1事务,此时T2唤醒但是提示冲突错误。
————————————————
版权声明:本文为CSDN博主「学而不思则忘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43207025/article/details/115412974

标签:事务,记录,幻读,T2,T1,详解,MySQL,id
From: https://www.cnblogs.com/bruce1992/p/16857307.html

相关文章

  • 简单聊聊mysql的脏读、不可重复读、幻读
    原文网址:https://blog.csdn.net/qq_44872791/article/details/122126225最近,在一次mysql死锁的生产事故中,我发现,关于mysql的锁、事务等等,我所知道的东西太碎了,所以,我......
  • MySQL(三)
    存储过程与存储函数1.存储过程1.1介绍含义:就是一组经过预先编译的SQL语句的封装.执行过程:存储过程预先存储在MySQL服务器上,需要执行的时候,客户端只需要想服务器端......
  • mysql数据库慢SQL优化
    mysql数据库慢SQL优化优化来源:阿里云云数据库RDS慢sql或者CAT监控系统中的TransactionSQLorURL根据平均时间反馈来排查,决定是否增加索引,或者调整业务逻辑代码。1.......
  • mysql旧版本实现row_number
    mysql8.0已经有row_number了,但是很多同学用的还是老版本,当需要用到row_number的功能时,老版本也是有解决方案的。比如我们有一张表sync_task_log,有三个字段ds_id,state,sy......
  • prometheus 监控案例-Tomcat、Redis、Mysql、Haproxy、Nginx
    服务监控  可以根据prometheus官网找到对应服务的exporter  https://prometheus.io/docs/instrumenting/exporters/监控Tomcat容器  基于第三方exporter实现......
  • C++智能指针:weak_ptr实现详解
    文章目录​​weak_ptr描述​​​​声明​​​​作用​​​​原理实现​​​​函数成员使用​​​​总结​​weak_ptr描述声明头文件:​​<memory>​​​模版类:​​template......
  • 在matlab中使用模糊编辑器实现模糊控制器的设计详解
    目录一、理论基础二、核心程序三、测试结果一、理论基础所谓模糊控制技术是指通过模糊集合和模糊逻辑等原理,并且和经典的控制理论相结合,并通过模拟人类的思考方式,对一......
  • this指针详解
    什么是this指针this是指向实例化对象本身时候的一个指针,里面存储的是对象本身的地址,通过该地址可以访问内部的成员函数和成员变量。一个对象的this指针并不是对象本身的一部......
  • explicit、implicit关键字详解
    这几天复习遇见这个关键字,有点疑惑,总结一下。我们首先需要知道,explicit只能用来修饰只有一个参数的构造函数。它的作用是表明该构造函数是显式的,而非隐式的,跟它对应的另一......
  • libmysqlclient.so.18: cannot open shared object file: No such file or directory
    DownloadTypeURLMirrorrepo.mysql.comBinaryPackage​​mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm​​SourcePackage​​mysql-community-5.7.26-1.el7.src.r......