Mysql的多版本并发控制MVCC

MVCC是InnoDB存储引擎的一种并发控制机制,它避免了行级锁带来的开销,实现了非阻塞读。在可重复读隔离级别下,MVCC通过行的创建和删除版本号确保事务看到一致视图。查询时只返回版本早于或等于事务版本的数据,插入、删除和更新操作则相应地更新这些版本号。MVCC不适用于读未提交隔离级别,而序列化读会锁定所有读取的行。
摘要由CSDN通过智能技术生成

MVCC(多版本并发控制)
可以认为是行级锁的一个变种,同时避免的很多枷锁操作,实现非阻塞的读操作,对于写操作来说只锁定必要的行。

  1. 实现原理
    通过保存数据在某个时间点的快照来实现,因此不管需要执行多长时间,每个事务看到的数据都是一致的。即由于事务开始的时间不同,每个事务对同一张表,对同一时刻的数据可能是不一样的。
    对于InnoDB来说,其MVCC通过在每行记录后面保存两个隐藏的列来实现,一个列保存行的创建时间(系统版本号),一个列保存行的过期时间(系统版本号),每次新建事务,其版本号都会递增,事务开始时刻的版本号作为事务的版本号,同查询到每行记录的版本号进行比较。

  2. 具体实现

     在可重复读的隔离级别下有:
     	**select** 
     		1.只查找版本早于(或等于)当前事务版本的数据行,可以确保所查数据为当前版本之前,或当前版本插入或修改的。
     		2.行的删除版本要么未定义,要么大于当前事务版本号,确保事务读取到的行,在事务开始之前未被删除。
     		符合的便为查询结果
     	**insert**
     		为新插入的每一行保存当前版本号为行版本号
     	**delete**
     		为删除的每一行保存当前的版本号为行删除版本号
     		**update**
     		为插入一行新纪录,保存当前系统版本号为行版本号,同时保存当前系统版本号到原来的行作为行删除版本号
     **只适用于可重复读和读已提交的隔离级别,对于读未提交,因为总是读取最新数据行,而不是符合当前事务版本的数据行,序列化读会对所有读取的行进行加锁**
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值