Mysql多版本并发控制

概念

Mysql的绝大多数事务型存储引擎都不是简单的行级锁。他们实现了多版本的并发控制,也就是MVVC,当然,支持MVVC的数据库并不只有Mysql,Orcale、PostgreSql等都实现了MVVC,只不过他们实现的方式不同而已,因为MVVC没有一个统一的规范。

其实MVVC可以理解为行级锁的一种变异,它会选择性加锁,避免的大部分情况下的枷锁操作,所以节省了cpu的开销,虽然每个数据库的实现方式不同,但都是并发读,串行写(必要的记录)。

MVVC是通过保存数据在某个时间点的快照实现的,也就是说,不管执行多少代码,多长时间,每个事务看到的数据应该是一致的。如果没有MVVC,根据Mysql的隔离级别,我们会发现,不同的事务之间,每个事务查询到的数据可能是不一致的,对这点不清晰的可以参考:事务特征以及隔离级别

虽然说不同的存储引擎有着不同的实现MVVC方式,但是最经典的莫过于乐观并发控制以及悲观并发控制,我们来说明一下他们分别如何实现并发控制。

InnoDB存储引擎是通过在每行记录的后面保留两个字段(隐藏),这两列,一个是保存了行的创建时间,哟i个是保存过期时间(删除时间)。当然,存储的并不是真是的时间值,而是系统版本号,每开启一个事务,系统的版本号都会叠加,整个事务都会一当前的版本号作为判断的基本条件。

查询:
InnoDB会根据下面两个条件查询每行记录:
1.InnoDB之查找版本号小于或等于当前事务版本号的数据行。
2.数据的删除版本要么没有指定,要么必须大于当前事务版本号,可以保证事务读取到的数据在事务开启之前未被删除。

插入:
InnoDB再插入的时候会在新行中保存当前系统的版本号作为行版本号。

删除:
InnoDB将需要删除的数据保存当前系统版本号作为删除表示。

修改:
InnoDB未插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为删除标识。

保存这两个额外的版本号,就可以让大多数读操作可以不加锁,提高了系统性能,并且也能保证只会督导符合标准的记录,但是这两个字段会占用额外的存储空间。

悲观并发控制其实就很简单了,那就是锁定指定行,同一时刻,只有一个事务能被执行,其他食物处于阻塞状态,这样消息并不是很好,但是不需要新增额外的字段。

MVVC只在read committed(读提交)与repeatable read(可重复读)两个隔离级别下工作,至于是什么原因,如果阅读了上面的事务特征以及隔离级别,相信就不难理解了。

发布了41 篇原创文章 · 获赞 79 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_33220089/article/details/104280146