1. 脏读

  所谓的脏读就是指一个事务读取了另一个事务未提取的数据。

试想一下:a账户要给b账户100元购买商品,如果a账户开启一个事务,执行下面的update语句做了如下转账的工作:

update account set money=money-100 where name='a';
update account set money=money+100 where name='b';

如果a账户先不提交事务,通知b账户来查询,由于b的隔离级别比较低,此时就会读取a事务中未提交的数据,发现a确实给自己转了100元,然后给a发货,等b发货成功之后,a再将事务回滚,此时b就会受到损伤,这就是脏读造成的。

 

为了演示上面的情况,这里我们开启了两个命令行窗口(相当于开启两个线程),分别模拟a账户和b账户,如下:

 

(1)设置b账户中事务的隔离级别

大家都知道MySQL的默认隔离级别是Repeatable Read(可重复读),该级别是可以避免脏读的,因此需要将b账户中事务的隔离级别设置为Read Uncommitted(读未提交),具体语句如下:

set session transaction isolation level read uncommitted;

如下:

 

上述语句之中,session表示当前会话,transaction就表示事务,isolation表示隔离,level表示级别,read uncommitted表示当前的隔离级别,该语句执行成功之后,使用select语句查询事务的隔离级别,结果如下:

select @@tx_isolation;

如下:

 

从上述结果可以看出,b账户的事务隔离级别以及修改为Read Uncommitted,接下来就是演示脏读的情况

 

(2)演示脏读

b账户:为了证明出现了脏读的情况,首先在b账户中开户一个事务,并在该事务中查询当前账户的余额信息,查询结果如下:

start transaction;
select * from account;

如下:

 

 

a账户:在a账户中开启一个事务,并在当前窗口中执行转账功能,具体语句如下:

start transaction;
update account set money=money-100 where name='a';
update account set money=money+100 where name='b';

如下:

需要注意的是:此时不要提交事务,如果提交事务就无法演示出现脏读的情况。

 

b账户:a账户执行完转账语句后,b账户查询当前账户,如下:

从上面的查询结果来看,a账户已经成功给b账户转账了100元,这是由于b账户的事务隔离级别比较低,因此才读取了a账户还没有提交的数据内容,出现了脏读的情况,这时候,b误以为a账户以及转账成功,便会给a发货,当b发货之后a如果不提交事务将事务回滚,b就会受到损失。

上面演示完毕了,需要将a账户中的事务回滚,b账户中的事务提交。

(3)设置b账户的事务隔离级别

为了防止脏读发生,可以将b账户中的事务隔离级别设置为Read Committed(读提交),该级别会避免脏读,具体语句如下:

set session transaction isolation level read committed;

上述的语句执行成功之后,b账户的隔离级别已经设置成Read Committed

(4)验证是否出现脏读

b账户:为了说明没有出现脏读的情况,首先要在b账户中开启一个事务,并在该事务中查询各账户的余额情况,查询结果如下:

a账户:在a账户中重新开启一个事务,实现了转账功能,如下:

start transaction;
update account set money=money- where name='a';
update account set money=money+ where name='b';

b账户:当a 账户转账成功之后,可以在b账户中再次查询各账户的余额信息,查询结果如下:

 通过上面的对比两次查询结果可以发现,b账户在同一个事务中的查询结果是一致的,并没有查询到a账户中未提交的内容,因此可以说明Read Committed 隔离级别可以避免脏读,最后分别将a账户和b账户中的事务回滚(方便以后演示)。

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

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

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

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

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

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

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

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

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

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

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

  6. mysql的事务,隔离级别和锁

    事务就是一组一起成功或一起失败的sql语句.事务还应该具备,原子性,一致性,隔离性和持久性. 一.事务的基本要素 (ACID) 1.原子性:事务开始后,所有的操作,要么全部成功,要么全部失败,不可能处 ...

  7. MySQL数据库事务各隔离级别加锁情况--Repeatable Read && MVCC(转)

    本文转自https://m.imooc.com/article/details?article_id=17289 感谢作者 上节回顾 上两篇记录了我对MySQL 事务 隔离级别read uncommi ...

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

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

  9. MySQL中事务的隔离级别

    MySQl InnoDB存储引擎实现SQL标准的4种隔离级别(RU,RC,RR,serializable),用来限定事务内外的哪些改变时可见的,哪些时不可见的.低级别的隔离级一般支持更高的并发处理,并 ...

随机推荐

  1. Maven Archetype Plugin

    使用Archetype的一般步骤 命令——mvn archetype:generate 输入命令后,Archetype插件会输出一个Archetype列表供用户选择:选择自己想要使用的Archetyp ...

  2. POJ 2378 Tree Cutting (DFS)

    题目链接:http://poj.org/problem?id=2378 一棵树,去掉一个点剩下的每棵子树节点数不超过n/2.问有哪些这样的点,并按照顺序输出. dfs回溯即可. //#pragma c ...

  3. How Tomcat Works(九)

    本文接下来描述servlet容器是怎样管理其相关组件的生命周期的,首先本人描述一下事件监听模式,也可以称为观察者模式,该模式分为以下角色 即抽象主题角色 具体主题角色 抽象观察者角色及具体观察者角色, ...

  4. Linux下用arptables防arp攻击

    Linux下网络层防火墙iptables很强大,链路层也有类似的防火墙arptables,可针对arp地址进行限制,防止ARP网关欺骗攻击,再配合静态绑定MAC和向网关报告正确的本机MAC地址,有效解 ...

  5. C#调用C++编写的dll库

    我用vs2008建的C++ dll类库,名字test_interopVC,和C#的CeshiVC项目 一:C++项目dll类库: 1.test_interopVC.h,主要简单的测试,所以就在一个类里 ...

  6. HTTP 错误 405.0 - Method Not Allowed

    如果A页面通过表单(form)向B页面传递参数,而B页面是以“.htm or .html ”为扩展名的话,通过IIS解析会出现“HTTP 错误 405 -禁止访问资源”错误的提示. 原因:IIS解析文 ...

  7. centos下 Apache、php、mysql默认安装路径

    centos下 Apache.php.mysql默认安装路径 http://blog.sina.com.cn/s/blog_4b8481f70100ujtp.html apache: 如果采用RPM包 ...

  8. Win8增加了快速启动功能......

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-05-11) Win8增加了快速启动功能,能让计算机尽快的启动进入Windows界面.win8的这种快速启动功能只会在“关机 ...

  9. Angular JS 使用的注意事项

    标签中ng-app,什么情况需要指定名称,什么时候又不需要呢? 1.ng-app="" <div ng-app="" ng-controller='myC ...

  10. Swift学习笔记十一

    类与结构体 Swift中,并不要求把自定义类或结构的接口和实现写在不同的文件中.你在一个文件中定义类或结构体,那么这个类或结构体的外部接口就自动可以在其他代码中使用了. 类和结构有很多相似和区别,相同 ...