码迷,mamicode.com
首页 > 数据库 > 详细

MySQL(26):事务的隔离级别出现问题之 幻读

时间:2016-05-15 09:40:38      阅读:327      评论:0      收藏:0      [点我收藏+]

标签:

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,1000);

执行结果如下:

技术分享

 

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

技术分享

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

 

 

3. 解决问题:

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

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

set session transaction isolation level repeatable read;

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

 

MySQL(26):事务的隔离级别出现问题之 幻读

标签:

原文地址:http://www.cnblogs.com/hebao0514/p/5494588.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!