不可重复读演示步骤3
切换到窗口 2 中再次查询用户列表,执行结果如下:
从上述结果可以看出,此时 Java 用户的余额已经变成 120 元了。在同一个事务中,先后查询的两次结果不一致就是不可重复读。
不可重复读和脏读的区别
脏读可以读到其他事务中未提交的数据,而不可重复读是读取到了其他事务已经提交的数据,但前后两次读取的结果不同。
幻读
幻读名如其文,它就像发生了某种幻觉一样,在一个事务中明明没有查到主键为 X 的数据,但主键为 X 的数据就是插入不进去,就像某种幻觉一样。幻读演示的执行流程如下:
具体执行结果如下步骤所示。
幻读演示步骤1
设置窗口 2 为可重复读,可重复有幻读的问题,查询编号为 3 的用户,具体执行 SQL 如下:
set session transaction isolation level repeatable read; start transaction; select * from userinfo where id=3;
以上 SQL 执行结果如下图所示:
从上述结果可以看出,查询的结果中 id=3 的数据为空。