MySQL高级-MVCC(超详细整理)

什么是MVCC

MVCC(multi-version-concurrent-control)

MVCC即多版本并发控制,MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。

MVCCMySQL InnoDB中的实现主要是为了提高数据库的并发性能,用更好的方式去处理读-写冲突,做到==即使有读写冲突时也能做到不加锁,非阻塞并发读==。

什么是当前读和快照读

  • 当前读

就像 select lock in share mode(共享锁)select for updateupdate,insert,delete(排他锁);这些操作都是一种当前读,为什么叫当前读?因为它读取的记录都是目前数据库中最新的版本,读取时还要保证其它并发事务不能修改当前记录,所以会对读取数据加锁

  • 快照读

像不加锁的select操作就是快照读,即不加锁的非阻塞读,快照读的前提是隔离级别不是串行级别串行级别下的快照读会退化成当前读

之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制(MVCC)

所以我们可以认为MVCC是行锁的一个变种,但MVCC在很多情况下它避免了加锁,降低了开销,既然是基于多版本的,所以快照读不一定读到的就是最新版本的记录,而是可能为之前的历史版本。

当前读,快照读和MVCC的关系

  • 准确的说,MVCC多版本并发控制是指:“维持一个数据的多个版本,使得读写操作没有冲突”这么一个概念,听起来特别像我们JAVA中的那个写时复制,但这只是一个理想概念。
  • 而在MySQL中,实现这么一个MVCC理想概念,我们就需要MySQL提供具体的功能去实现它,而快照读就是MySQL为我们实现MVCC理想模型的其中一个具体非阻塞读功能不同的快照,可以看作不同的数据版本。而相对而言,当前读就是悲观锁的具体功能实现
  • 要说得再细致一点,快照读本身也是一个抽象概念,再深入研究。MVCC模型在MySQL中的具体实现则是由四个隐式字段undo日志read view 等去完成的。

MVCC能解决什么问题?好处是什么?

数据库并发场景?

当前假设有三种,分别为:

  • 读-读:不存在任何问题,也不需要并发控制。
  • 读-写:有线程安全问题,可能会造成事务隔离性问题,也就是可能遇到,脏读,不可重复读,幻读等。
  • 写-写:有线程安全问题,可能会存在更新丢失问题,比如第一类更新丢失,第二类更新丢失。

MVCC带来的好处是?

**多版本并发控制(MVCC)**是一种用来解决 读-写 冲突的无所并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,也就是每个事务都有一个对应版本的快照,快照版本按照单向增长的时间戳来决定先后顺序。

在这样的情况下,读操作,我们只读该事务开始前的数据库快照,并不去读取正在修改的数据,我们读取事务开始前的最新版本。

所以解决了数据库在并发读取时的问题,即可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能,同时还可以解决脏读,不可重复读,幻读等事务隔离级别带来的问题。但不能解决更新丢失问题。

小结一下

总之,MVCC就是因为大牛们,不满意只让数据库采用悲观锁这些性能不佳的形式去解决读-写冲突问题,而提出的解决方案,所以在数据库中,因为有了MVCC,所以我们可以形成两个组合:

  • MVCC + 悲观锁 MVCC解决读写冲突,悲观锁解决写-写冲突。
  • MVCC + 乐观锁 MVCC解决读写冲突,乐观锁解决写-写冲突。

MVCC的实现原理

MVCC的目的就是多版本的并发控制,在数据库中的实现,就是为了解决读-写冲突的问题,它的实现原理主要是依赖记录中的 3个隐式字段、undo日志、read view 来实现的。

隐式字段

每行记录除了我们自定义的字段外,还有数据库隐式定义的DB_TRXID, DB_ROLL, DB_ROW_ID等字段。

  • DB_ROW_ID
    • 6byte,隐含的自增ID(隐藏主键),如果数据表没有主键InnoD
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值