MySQL(25):事务的隔离级别出现问题之 不可重复读

1. 不可重复读session

所谓的不可重复读(Non-Repeatable Read)是指事务中两次查询的结果不一致,缘由是在查询的过程当中其余事务作了更新的操做。spa

例如,银行在作统计报表的时候,第一次查询a帐户有1000元,第二次查询a帐户有900元,缘由是统计期间a帐户取出了100元,这样致使屡次统计报表的结果不一致。线程

不可重复读和脏读有点相似,可是脏读是读取了另外一个事务未提交的脏数据,不可重复读是在事务内重复读取了别的线程已提交的数据。code

 

2. 演示不可重复读blog

(1)b帐户:首先在b帐户中开启一个事务,而后在当前事务中查询各个帐户的余额信息,查询结果以下:事务

 

(2)a帐户:在a帐户中不用开启事务,直接使用update语句执行更新操做便可,具体语句以下:同步

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

因为a帐户只须要执行修改的操做,不须要保证同步性,所以直接执行SQL语句就能够,执行结果以下所示:io

 

接下来使用select语句查询a帐户的余额,以下:table

 

 

(3)再次回到b帐户,以下:class

b帐户:当a帐户中的更新操做执行完毕以后,在b帐户之中再次查询各帐户的余额,发现a帐户变成900元。

两次b帐户查询的结果不一致,实际上这种操做是没有错的

 

3. 如何解决这个问题?

设置b帐户的事务的隔离级别

b帐户:为了防止重复读的状况发生,能够将该事务的隔离级别设置为Repeatable Read(可重复读),具体以下:

set session transaction isolation level repeatable read;
相关文章
相关标签/搜索