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. POP3&SMTP&IMAP

    [POP3&SMTP&IMAP] IMAP是什么? IMAP,即Internet Message Access Protocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上 ...

  2. Java模板引擎 FreeMarker

    @(编程) [TOC] 1. 简介 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.它是为Java程序员提供的一个开发包.它不是面向最终用户的,而是为程序员 ...

  3. oracle关键字使用

    v_Describe:=substr(v_Describe,0,length(v_Describe)-1); substr(目标内容,开始位置,截取长度) length(要计算的内容长度) 上述语句可 ...

  4. VISIO 2007 修改形状默认字体 自定义模具

    visio 2007的形状的默认字体为8号,比较小,怎样改成默认10号? 首先将一个流程图中所要用的形状都拖到绘图区,然后全选,设置字体为10号,全选,再拖动到形状区,如下图: 点击‘是’,确认修改模 ...

  5. ZOJ 3596Digit Number(BFS+DP)

    一道比较不错的BFS+DP题目 题意很简单,就是问一个刚好包含m(m<=10)个不同数字的n的最小倍数. 很明显如果直接枚举每一位是什么这样的话显然复杂度是没有上限的,所以需要找到一个状态表示方 ...

  6. webservice接口的发布

    使用xfire-client发布webservice接口: commons-codec-1.3.jar commons-httpclient-3.0.jar 在src 下创建META-INF/xfir ...

  7. 使用Vagrant在Windows下部署开发环境

    做Web开发少不了要在本地搭建好开发环境,虽然说目前各种脚本都有对应的Windows版,甚至是一键安装包,但很多时候和Windows环境的相性并不是那么好,各麻烦的问题是实际部署的环境通常是Linux ...

  8. SQL with(unlock)与with(readpast) (转)

    所有Select加 With (NoLock)解决阻塞死锁,在查询语句中使用 NOLOCK 和 READPAST 处理一个数据库死锁的异常时候,其中一个建议就是使用 NOLOCK 或者 READPAS ...

  9. C++ map注意事项

    1.在map中,由key查找value时,首先要判断map中是否包含key. 2.如果不检查,直接返回map[key],可能会出现意想不到的行为.如果map包含key,没有问题,如果map不包含key ...

  10. Codeforces Gym 100231L Intervals 数位DP

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description Start with an integer, N0, ...