首页
登录 | 注册

脏读 不可重复读和幻读&mysql的不可重复读

Mysql有四种隔离级别:read uncommited,read commited,repeatable read,serializable。这四种隔离级别分别解决了一些特定的问题

read uncommited: 可以读取未提交的事务数据,也就是读取了“脏数据”,产生了数据库领域的术语“脏读”。

read commited:
只能读取已经提交的事务数据,但是如果A事务读取了某一行数据,A事务未提交,B事务修改了这一行数据然后提交,这时候A事务再去
读取该行数据那么就会发现两次读取的同一行的数据发生了变化,这就是“不可重复读”。

repeatable read:
可重复读,即事务A不论多少次读取同一行数据该行数据都不会发生变化,但是如果事务A读取某一个范围内的数据,事务A未提交,事务B在该范围内插入一行数据或者删除一行数据,这时候事务A再去读该范围内的数据发现数据量有变化,这就是“幻读”。不可重复读和幻读很相似,但是在数据控制方面有很大的不同,解决不可重复读的方法是锁定事务A涉及的所有行,解决幻读的方法是锁定事务A涉及的所有行及其边界。但是mysql的repeatable read级别是很神奇的,mysql通过间隙锁解决了幻读问题,但是并不是彻底的解决,只是解决了读的问题,其他的DDL操作可能会受到影响,如下面的例子:

        

                                              session1                                               session2

session1查询数据





session2 插入数据然后提交,可以看到session1并没有锁住(6,无穷大)的间隙,由于测试
的时候进行了误操作,所以ID向前多加了一,但是并不影响测试。

session1进行查询,发现并没有发生幻读的现象


session1尝试插入一条数据,该数据的主键为7,即跟session2插入的行的主键相同,这时会发现mysql报重复主键的错误


由表格可以看到session1依然是能够“看到”session2插入的行数据,所以在使用repeatable read隔离级别进行开发的时候需要特别注意到这种情况。


serializable:序列化的事务处理,即事务是顺序处理的,可以解决上面提到的所有问题,但是为了提升数据库性能一般不会设置这种隔离级别。




相关文章

  • 深入理解 MySQL ——锁、事务与并发控制
    目录 2.MySQL 锁 4.隔离级别 6.MySQL 死锁问题 1.MySQL 服务器逻辑架构 每个连接都会在 MySQL 服务端产生一个线程(内部通过线程池管理线程),比如一个 select 语句进入,MySQL 首先会在查询缓存中查找 ...
  • MYSQL企业常用架构与调优经验分享
    一.选择Percona Server.MariaDB还是MYSQL 1.Mysql三种存储引擎 MySQL提供了两种存储引擎:MyISAM和 InnoDB,MySQL4和5使用默认的MyISAM存储引擎.从MYSQL5.5开始,MySQL已 ...
  • MySQL数据结构分析--NET
    目的        MySQL网络通信数据结构NET,是基于Vio底层封装,用于实现Client/Server网络通信的基本处理.而核心处理主要是网络通信的读写策略,设计良好的读写策略,可以有效提高网络通信的性能.本文主要通过分析MySQL ...
  • 解决方法一:(最重要的一种方法)你看下my.ini,有无 [mysql] default-character-set=utf8 [client] default-character-set=utf8 [mysqld] default-cha ...
  •  更多Java培训.Java视频教程学习资料,请登录尚硅谷网站下载:www.atguigu.com  ?1. 背景及目标? 厦门游家公司(4399.com)用于员工培训和分享.? 针对用户群为已经使用过mysql环境,并有一定开发经验的工程 ...
  • 【Java Web开发】数据库及SQL/MySQL基础
    详细课程链接:[Java Web开发]数据库及SQL/MySQL基础 -- 阿里云大学 MySQL概述 什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 什么是 MySQL.Oracle.SQL ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.012 s.
京ICP备10005923号