分歧性视图是啥时刻建设的

在上篇文章中触及到了一个小小的疑问,就是数据库事务的分歧性视图是啥时刻建设的?

这个疑问还比拟关键,假设没搞分明,或许会影响咱们做试验的结果,进而得出失误的论断,所以当天松哥和大家便捷聊一聊这个话题。

1. 失误演示

先给大家来一个失误演示。

咱们关上两个会话窗口,自动状况下隔离级别是可重复读,咱们来看下:

首先在 A 会话中检查 user 表,检查成功后开启事务:

可以看到 age 是 101。

接上去在 B 会话中修正 age:

可以看到,B 会话曾经修正成功。

接上去回到 A 会话查问记载:

可以看到,A 会话的记载也变了。完整测试流程如下:

说好的可重复读呢?

按理说,可重复读就是别的事务对数据的操作不影响事务,然而上方这个案例仿佛和咱们了解的可重复读有出入。

2. 剖析

不知道小同伴们能否还记得可重复读的特点:

用户在另外一个事务中口头同条 SELECT 语句数次,结果总是相反的。

从这个角度来说,第一小节的案例仿佛也没有疑问,由于咱们在 A 会话中口头 SELECT 语句屡次,查到的结果也都是相反的,age 都是 102。

然而咱们纳闷的是明明 B 会话的事务后开启的,然而咱们却在 A 会话中读取到了 B 的修正,这仿佛不应该。

这里就触及到一个疑问,事务的分歧性视图是何时建设的?

理想上,咱们口头的 begin 语句并不是一个事务真正的终点。口头完 begin 之后,接上去口头的第一句 SQL,事务才真正启动。

咱们稍微修正一下第一小节的案例:

在 A 会话中,事务开启之后,立马先口头一条 SELECT 语句,而后再去 B 会话中做修正,修正成功后再回到 A 会话继续查问,此时发现 B 中的修正对A 并无法见,这个结果也合乎用户在另外一个事务中口头同条 SELECT 语句数次,结果总是相反的。

假设咱们想要口头完 begin 之后,就立马开启事务,那么可以经过如下模式来口头:

这个 SQL 口头完之后,事务立马就启动了。

接上去,回到第一小节的案例,咱们修正一下事务启动的命令:

此时,A 会话中事务的查问就看不见 B 中的修正了。

3.小结

好啦,一个小小的案例,宿愿小同伴们在做试验的时刻不要出错。本文触及到一个概念叫做分歧性视图,假设大家不相熟可以参考上篇文章。

您可能还会对下面的文章感兴趣: