MySQL事务的幻读

幻读——PHANTON READ
又称为虚度,是指在一个事务内,两次查询中数据条数不一致
幻读和不可重复读类似,都是在两次查询过程中,区别,幻读是由于其他事务做了插入记录的操作,导致,记录条数有所增加

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

MySQL事务的幻读

演示幻读

B账户,首先,在b账户中开启一个事务,在事务中查询账户的余额

MySQL事务的幻读

A账户,在对a账户操作之前,查询当前账户中的信息

MySQL事务的幻读

对a账户执行添加操作,a账户不用开启事务,直接执行添加操作

MySQL事务的幻读

B账户,当a账户添加成功后,在b账户中,再次查询账户的余额

MySQL事务的幻读

可以看出,第二次查询比第一次查询,多了一条记录
这种情况不是错误的,但是,不符合实际需求,演示完成,将b账户中的事务提交

重新设置b账户的隔离级别
B账户,为了防止出现幻读,将b账户的隔离级别设置为REPEATABLE READ

MySQL事务的幻读

验证是否出现幻读

B账户,重新开启一个事务,查询当前账户的余额

MySQL事务的幻读

A账户,进行添加操纵之前,先查看账户中的信息

MySQL事务的幻读

对a账户执行添加操作,不开启事务,直接执行添加操作

MySQL事务的幻读

B账户,当a账户执行完添加操作,再次,查询当前账户中的信息

MySQL事务的幻读

可以看出,两次查询结果一致,在同一个事务中,两次的查询结果是一致的

因此,事务的隔离级别为REPEATABLE READ,可以避免幻读
最后,使用commit提交当前事务,提交之后,查询账户的余额

MySQL事务的幻读

可以看出,账户的信息已经修改,添加了一条新纪录