首页 > 数据库 >mysql 隔离级别为可重复读如何解决幻读

mysql 隔离级别为可重复读如何解决幻读

时间:2024-05-02 19:11:30浏览次数:36  
标签:事务 隔离 幻读 查询 重复 mysql 级别

MySQL 中的可重复读(Repeatable Read,RR)隔离级别通过几种机制来解决幻读问题:

1. **多版本并发控制(MVCC)**:
在可重复读隔离级别下,MySQL 使用MVCC来管理事务读取的数据版本。这意味着在事务开始时,系统会创建一个Read View(读视图),该视图记录了当前所有活跃事务的ID。当执行SELECT查询时,事务只会看到在它启动时已经提交的事务所写入的数据,以及它自己做的更改。因此,即使其他事务在此期间插入了新行,这些新行对于当前事务来说是不可见的,从而避免了幻读。

2. **Next-Key Locks**:
InnoDB 存储引擎在执行某些类型的查询(如范围查询)时,会使用Next-Key Locks,这是一种组合了记录锁(锁定实际的行)和间隙锁(锁定两个键值之间的范围,防止插入)的锁策略。这种锁机制可以阻止其他事务在当前事务查询的范围内部插入新行,从而避免了幻读现象。例如,如果事务A执行了一个范围查询并获取了相应区间上的Next-Key Locks,那么事务B在这个区间内尝试插入新行将会被阻塞,直到事务A结束。

需要注意的是,虽然可重复读级别通常能有效避免幻读,但在某些特定场景下,如使用锁(如SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE)进行当前读操作时,还是有可能观察到幻读现象。这是因为这类操作会查看并锁定最新的数据,而不是基于事务开始时的Read View。因此,如果在同一个事务中混合使用快照读和当前读,理论上仍存在幻读的可能性。但总体上,可重复读隔离级别通过上述机制极大地减少了幻读发生的概率。

标签:事务,隔离,幻读,查询,重复,mysql,级别
From: https://www.cnblogs.com/maidongdong/p/18170450

相关文章

  • MySQL8.4的安装与部署
    MySQL8.4的安装与部署下载wgethttps://cdn.mysql.com//Downloads/MySQL-8.4/mysql-8.4.0-1.el8.aarch64.rpm-bundle.tar安装清理mariadbrpm-qa|grepmaria|grep-vconnect|xargsrpm-e-f本地安装tar-xvfmysql-8.4.0-1.el8.aarch64.rpm-bundle.taryumlocali......
  • mysql安装教程
    1、先下载好mysql5.7版本的安装包,https://www.mysql.com/downloads/官网自己下载 2、这里选则windows 3、选择我们需要的版本  4、最后下载成功安装包就下载完毕了(官网下载可能较慢需要安装包的可以私信我) 一.mysql安装下载后双击安装包开始mysql5.7.33......
  • Mysql中的DML
    插入语句--语法INSERTINTOtable_name(column1,column2,column3,...)VALUES(value1,value2,value3,...);--如果数据是字符型,必须使用单引号'或者双引号",如:'value1',"value1"。--如果要插入所有列的数据,可以省略列名INSERTINTOusersVALUES(NULL,'test'......
  • Mysql基础
    为什么要配置环境变量?当你想直接用cmd打开某个.exe软件,但却出现以上情况时,可以通过配置环境变量来解决。配置了常用软件的环境变量后,在系统的任意路径下,打开cmd,输入软件,即可打开应用。环境变量:是在操作系统中用来指定操作系统运行环境的一些参数。环境变量中的path环境变量:......
  • mysql连接不上,服务中找不到mysql
    分析因为太久没使用mysql,服务自动删除了解决注册/安装服务win+x,a,以管理员打开powershell(或者使用cmd,随你)#注意此处需要引号,因为有空格#1.cd到mysql的可执行文件,如果记不得或者像我一样懒,直接everything搜索mysqld.exe即可cd'C:\ProgramFiles\MySQL\MySQLServer8......
  • You have an error in your SQL syntax; check the manual that corresponds to your
    在进行增加User对象时采用了PreparedStatement对象,方法executeQuery()和executeUpdate()都是无参方法,所以不要写成prepareStatement.executeQuery(sql)或prepareStatement.executeUpdate(sql)publicintadd(Useruser){Connectionconnection=JDBCTools.getConnecti......
  • quine和mysql8新特性
    Quinesqliquine是mysql注入中的一种特殊的攻击方式.服务端对于用户登录的判断方式如下,则可以考虑quine攻击.functioncheckSql($s){if(preg_match("/regexp|between|in|flag|=|>|<|and|\||right|left|reverse|update|extractvalue|floor|substr|&|;|\\\$|0x|sleep|\/i"......
  • 关于在CentOS7的docker容器下启动MySQL5.7.44卡住的问题的解决办法
    最近想在docker中跑一个MySQL5.7版本的服务,而且要基于CentOS,所以着手自己构建镜像。容器的构建参照下面这篇文章基于CentOS7镜像容器的MySQL环境构筑-sxb_sunday-博客园(cnblogs.com)构建完成后,用下面命令启动MySQL服务的时候,启动进程一直卡住没有反应,只能CTRL+C强制停止。......
  • CentOS7上的Mysql8.3允许远程连接
    点击查看代码[root@clone2~]#mysql-uroot-pEnterpassword:WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis9Serverversion:8.3.0MySQLCommunityServer-GPLCopyright(c)2000,2024,Oracleand/oritsaffiliates......
  • 记录一下MySQL的连接
       简单的2张表演示1.左连接SELECTCustomerPro.ID,CustomerPro.CustomerName,Employee.EmployeeNameFROMCustomerProLEFTJOINEmployeeonCustomerPro.EmployeeID=Employee.ID2.右连接SELECTCustomerPro.ID,CustomerPro.CustomerName,Employee.EmployeeName......