正在上篇著作中触及到了一个小小的题目,便是数据库事宜的划一性视图是啥期间确立的?
这个题目还比拟要紧,假如没搞明白,可以会影响咱们做试验的了局,进而得出舛错的论断,是以本日松哥和群众简陋聊一聊这个话题。
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 以后,就立马开缘由宜,那末可能经由过程如下方法来履行:
starttransactionwithconsistentsnapshot;
这个 SQL 履行完以后,事宜立马就启动了。
接上去,回到第一末节的案例,咱们改正一下事宜启动的号召:
此时,A 会话中事宜的查问就看不睹 B 中的改正了。
3.小结
好啦,一个小小的案例,祈望小搭档们正在做试验的期间不要堕落。本文触及到一个观点叫做划一性视图,假如群众不熟习可能参考上篇著作。
文章推荐: