在上篇著述中触及到了一个小小的问题,等于数据库事务的一致性视图是啥本事开辟的?
这个问题还相比蹙迫,若是没搞明晰,可能会影响咱们做施行的后果,进而得出不实的论断,是以今天松哥和全国简单聊一聊这个话题。
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 之后,就立马开缘由务,那么不错通过如下模式来实施:
start transaction with consistent snapshot;
这个 SQL 实施完之后,事务立马就入手了。
接下来,回到第一末节的案例,咱们修改一下事务入手的大叫:
此时,A 会话中事务的查询就看不见 B 中的修改了。
3.小结好啦,一个小小的案例,但愿小伙伴们在做施行的本事不要出错。本文触及到一个主张叫做一致性视图,若是全国不熟习不错参考上篇著述。