上一篇涉及到一个小问题,即数据库事务的一致性视图是什么时候建立的?这个问题还是蛮重要的。如果不了解,可能会影响我们的实验结果,进而得出错误的结论。那么今天宋歌就和大家简单聊聊这个话题。一、错误演示先给大家做个错误演示。我们打开两个会话窗口。默认情况下,隔离级别是可重复读。我们看一下:首先在sessionA中查看当前用户表,检查完成后开始事务:可以看到当前age为101,接下来在sessionB中修改age:可以看到sessionB已修改成功。接下来回到sessionA查询记录:可以看到sessionA的记录也发生了变化。完整的测试流程如下:可重复阅读呢?按理说可重复读是指其他事务对数据的操作不会影响当前事务,但是上面的案例好像和我们对可重复读的理解不太一样。2、分析不知道小伙伴们还记得可重复读的特性:用户在另一个事务中多次执行同一条SELECT语句,结果总是一样的。从这一点来看,第一节的case似乎没有问题,因为我们在sessionA中执行了多次SELECT语句,结果都一样,age都是102。但是我们所知道的比较疑惑的是,它是在sessionB的事务之后开启的,但是我们在sessionA中看了B的修改,貌似是错误的。这里有一个问题,事务的一致性视图是什么时候成立的?事实上,我们执行的begin语句并不是事务的真正开始。执行完begin后,接下来执行的第一条SQL语句会启动事务。我们把第一节的案例稍微修改一下:在sessionA中,事务启动后,立即执行一条SELECT语句,然后去sessionB做修改,修改完成后再回到sessionA继续查询.A中的修改对A是不可见的,这个结果也符合用户在另一个事务中多次执行同一条SELECT语句,结果始终相同。如果我们想在执行完begin后立即启动事务,可以这样执行:starttransactionwithconsistentsnapshot;SQL执行后,事务立即开始。接下来,回到第一节的案例,我们来修改一下启动事务的命令:此时sessionA中事务的查询将看不到B中的修改。3.总结好了,一个小case,希望小伙伴们在做实验的时候不要出错。这篇文章涉及到一个概念,叫做一致性视图。不熟悉的可以参考上一篇文章。
