Mysql--Innodb的MVCC

MVCC—多版本并发控制

 

原理:保存数据在某个时间点的快照。即不同时间点开启的多个事务,对于同一张表的同一个数据看得到有可能都不一样。

 

Innodb的MVCC实现

 

  1. 每行记录后面保存两个隐藏列,一个保存行的创建时间,一个保存行过期时间,虽然说是时间,但其实他们存储的是系统版本号。个人猜测是时间戳的毫秒数。
  2. 每当开启一个新的事务系统版本号会进行递增。也就是时间戳递增。当前系统版本号也会作为当前事务版本号。
  3. SELECT会附加查询条件:a,查询行创建时间字段小于当前事务版本号的数据。保证查询到的数据是当前事务开启前或当前事务增加的数据。b,查询行过期时间为null或者大于当前事务版本号的数据,保证当前读取到的数据在事务开启前未被删除。
  4. INSERT时会将当前事务版本号保存到创建时间。
  5. DELETE时将当前事务版本号保存到过期时间。
  6. UPDATE 比较特殊,Innodb会先插入一条新的当前数据,并且将当前事务版本号保存到创建时间。然后将当前事务版本号保存到当前数据原有数据行的过期时间。
  7. 优点:不用加锁减少开销。
  8. 缺点:每行记录多占用额外存储空间。多出很多维护工作。
  9. MVCC仅在RC和RR级别生效。
  10. 为什么RU不生效??因为RU要求读取的永远是最新行,MVCC不符合标准。
  11. 那为什么串行化也不生效??因为他会对所有读取到的数据加锁。保证只有一个事务可以操作数据,也就没机会做多版本控制。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值