分歧性视图是啥时刻建设的
在上篇文章中触及到了一个小小的疑问,就是数据库事务的分歧性视图是啥时刻建设的?
这个疑问还比拟关键,假设没搞分明,或许会影响咱们做试验的结果,进而得出失误的论断,所以当天松哥和大家便捷聊一聊这个话题。
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.小结
好啦,一个小小的案例,宿愿小同伴们在做试验的时刻不要出错。本文触及到一个概念叫做分歧性视图,假设大家不相熟可以参考上篇文章。