1. 幻读

幻读(Phantom Read)又称为虚读,是指在一个事务内两次查询中数据条数不一致,幻读和不重复读有些类型,同样是在两次查询过程中,不同的是,幻读是由于其他事务做了插入记录的操作,导致记录数有所增加。

例如:银行在做统计报表时统计account表中所有用户的总金额时候,此时总共有三个账户,总共金额为3000元,这时候新增了一个用户账户,并且存入1000元,这时候银行再次统计就会发现账户总金额为4000,造成了幻读情况

2. 演示幻读:

(1)首先我们设置b账户的隔离级别

b账户:由于前面将事务个隔离级别设置为可重复读,这种隔离级别是可以避免幻读的出现,因此需要将事务的隔离级别设置为更低,下面将事务的隔离级别设置为

Read Committed,具体语句如下:

set session transaction isolation level read committed;

上述语句执行完成之后,b账户事务的隔离级别为Read Committed

(2)演示幻读:

b账户:首先在b账户中开启一个事务,然后在当前事务中查询账户的余额信息,查询结果如下:

a账户:在对a账户进行添加操作之前,使用select语句查看当前a账户中的信息,执行结果如下:

接下来对a账户进行添加操作,a账户不用开启事务,直接执行添加操作即可,具体语句如下:

insert into account(name,money) values('c',);

执行结果如下:

b账户:当a账户添加记录完成之后,可以在b账户中再次查询场合余额信息,如下:

通过对比b账户设置Read Committed隔离级别前后,发现第二次查询数据时比第一查询数据时候多一条记录,这种情况并不是错误的,但可能不符合实际需求。需要注意的是,上述情况演示完成之后,将b账户中的事务提交。

3. 解决问题:

(1)重新设置b账户的隔离级别

b账户:为了防止出现幻读,可以将b账户的隔离级别设置为Repeatable Read,具体语句如下:

set session transaction isolation level repeatable read;

上述的语句执行完毕之后,事务隔离级别设置为Repeatable Read

 (2)重新验证是否出现幻读

b账户:在b账户中重新开启一个事务,并在该事务中查询当前账户的余额信息,查询结果如下:

a账户:对a账户进行添加操作之前,使用select语句查看当前的a账户的余额信息,执行语句结果如下:

接下来对账户a进行添加操作,在a账户中不开启事务,直接执行添加操作,具体语句如下:

insert into account(name,money) values('d',);

执行结果如下:

b账户:当a账户的添加操作执行成功之后,再次查询当前账户的余额信息,查询结果如下:

对比b账户两次查询的结果,发现两者都是一致的。并没有出现重复读取的情况,因此可以说明当前事务的隔离级别可以避免幻读,最后还有使用commit语句提交当前事务,提交之后,b账户查询结果如下:

MySQL(26):事务的隔离级别出现问题之 幻读的更多相关文章

  1. Mysql数据库事务的隔离级别和锁的实现原理分析

    Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...

  2. Mysql 间隙锁原理,以及Repeatable Read隔离级别下可以防止幻读原理(百度)

    Mysql知识实在太丰富了,前几天百度的面试官问我MySql在Repeatable Read下面是否会有幻读出现,我说按照事务的特性当然会有, 但是面试官却说 Mysql 在Repeatable Re ...

  3. 浅析SQL Server在可序列化隔离级别下,防止幻读的范围锁的锁定问题

    本文出处:http://www.cnblogs.com/wy123/p/7501261.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错 ...

  4. MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转载)

    http://www.imooc.com/article/17290 http://www.51testing.com/html/38/n-3720638.html https://dev.mysql ...

  5. MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转)

    本文转自https://m.imooc.com/article/details?article_id=17290 感谢作者 上篇记录了我对MySQL 事务 隔离级别read uncommitted的理 ...

  6. MySQL数据库事务各隔离级别加锁情况--read uncommitted篇(转)

    本文转自https://m.imooc.com/article/details?article_id=17291,感谢作者 1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解 ...

  7. Mysql数据库事务及隔离级别学习测试

    参考了这篇文章的一些内容: http://xm-king.iteye.com/blog/770721 记住以下这张表: 我在springdemo库里面建了一个表: CREATE TABLE `tx` ...

  8. SQL Server中的事务与其隔离级别之脏读, 未提交读,不可重复读和幻读

    原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...

  9. 一文搞定MySQL的事务和隔离级别

    一.事务简介 事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成. 一个数据库事务通常包含了一个序列的对数据库的读/写操作.它的存在包含有以下两个目的: 为数据库操作序列提供 ...

随机推荐

  1. Field 'SCHED_TIME' doesn't have a default value

    出现这个情况的原因是: 我jar包使用的是quartz-2.1.7版本,但是初始化集群的dbTables脚本用的却是2.2.1版本的,导致出现这个异常,改用2.1.7的dbTables脚本之后即解决问 ...

  2. win2008 64位 + oracle11G 64位 IIS7.5 配置WEBSERVICE

    第一个错误: 安装过程依旧是那样简单,但在配好IIS站点,准备连接数据库的时候出错了,以下是错误提示:System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更 ...

  3. Codeforces 543D. Road Improvement (树dp + 乘法逆元)

    题目链接:http://codeforces.com/contest/543/problem/D 给你一棵树,初始所有的边都是坏的,要你修复若干边.指定一个root,所有的点到root最多只有一个坏边 ...

  4. c++,windows中的字符问题

    string与char*的转换方法 string a; char *b=a.c_str(); string a=new String(b); a=b; LPCWSTR是unicode的字符串,LPCS ...

  5. zendstudio 出现failed to create the java machine转

    是因为配置java虚拟机内存太小 打开zend for eclipse 10.5时报了个错: failed to create the java virtual machine google了一下,解 ...

  6. 最小生成树之Prime法

    关于最小生成树的概念,在前一篇文章中已经讲到,就不在赘述了.下面介绍Prime算法:         其基本思想为:从一个顶点出发,选择由该顶点出发的最小权值边,并将该边的另一个顶点包含进来,然后找出 ...

  7. 窥探EasyMock(2)进阶使用篇

    from:http://www.iteye.com/topic/310313 1. 生成 Mock 对象 如何创建一个需要严格遵守调用顺序的mock对象? SomeInterface mockObj  ...

  8. js 函数的传值问题

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. 解决IE6不支持position:fixed属性

    最近在优化网站浮动广告时候遇见了IE6不支持position:fixed属性.上网收集了一下解决方案 比较好的方案就是利用css表达式进行解决 补充:CSS Expression (CSS 表达式), ...

  10. vim编码相关配置

    主要与三个参数有有关 fileencoding 缩写:fenc 保存文件时所用的编码 set fenc 查看当前文件的编码 set fenc=utf-8 可以将当前文件转换为utf-8编码 filee ...