少年,你可听说过MVCC?

:切!这谁没听过,不就是多版本并发控制么~

早在亘古时期,修真界就流传着一门mysql功法,将其修至小乘境界,足以纵横一方。。。不乏也有走火入魔者,为祸一方~

Serializable篇

强制事务排序,串行化执行事务。技能之间不存在冲突,就是滚键盘~能不能再快点呢,技能前摇那么长,一次性放俩多好^_^

Read Uncommitted篇

某个不知名大牛路过你这样搞一下试试:

事务1事务2
select * from table where key = 1;
update table set name="da niu" where key = 1;
select * from table where key = 1;

看到了没,事务1第一次查询的结果和第二次查询的结果还能一样吗,this is 脏读!

Read Committed篇

原来这就是脏读啊,那我等到事务2提交之后再读,不就ok了吗^_^

事务1事务2
select * from table where key = 1;
update table set name="da niu" where key = 1;
commit
select * from table where key = 1;

你能说事务1第二次读出来的数据是脏的吗?不能。但是事务一两次读取的数据结果仍然不同,这叫做不可重复读问题。

Repeatable Read篇

这还怎么搞。。。

据说是有个头秃哥,搞了叫Read View个东西出来。Read View可以认为是数据库的一个内部快照,根据事务的隔离级别,决定在事务开始时,该事务能看到什么信息。就是说通过Read View,事务可以知道此时此刻能看到哪个版本的数据记录(有可能不是最新版本的,也有可能是最新版本的)。可重复读、读已提交、读未提交,这几个隔离级别都会使用Read View。

ReadView中主要包含几个比较重要的字段:

creator_trx_id创建Read View事务的id
trx_ids生成Read View时活跃的事务id集合
up_limit_idtrx_ids中最小的事务id
low_limit_id生成Read View时下一个可分配的事务id

有了这些id信息,即使事务2已提交的情况下,也不会出现可重复读的问题了:

事务1事务2
select * from table where key = 1;(获取Read View)
update table set name="da niu" where key = 1;
commit
select * from table where key = 1;(获取Read View)

第一次查找获取Read View,当前事务id为0,该行数据的trx_id小于事务1Read View中的up_limit_id,即该行数据为事务1创建之前产生的,故而对事务1可见;

第二次查找,该行数据的trx_id被事务2改为了自己的事务id,使得trx_id在事务1Read View的trx_ids中,说明改行数据由创建事务1时的其它活跃事务更新过,故而使其对事务1不可见;

:数据就没。。没了?

当然不会,还记得undo log吗,记录了事务语句执行前的数据快照。我们通过读取undo log,就能拿到修改前的数据了^_^

类似的,如果在事务1创建之后,又有事务3被创建,并修改了key=1的数据,则该行记录的trx_id大于等于事务1Read View中的low_limit_id,也可以知晓当前数据被修改过来。继续根据undo log恢复以前版本的数据即可。

这就是多版本并发控制了。。。

幻读篇

那幻读又是啥呢??

前面说了不可重复读的问题,是说同一个事务中,多次查询同一条记录,查询结果不同的问题;

幻读其实也很简单,说的是同一个事务中,查询多次,查询结果记录条数不一致的问题;

明白了吧,一个是说记录本身的内容发生变化,另一个说的是记录的条数。

显然,通过MVCC,也能解决幻读的问题了

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fireplusplus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值