MVCC是行级锁的一个变种,但是它在很多的情况下避免了加锁操作,因此开销更低。MySQL,包括Oracle、PostgreSQL都实现了MVCC,虽然每个关系数据库实现不一样,但大都是实现了非阻塞的读操作,写操作也只锁定必要的行。
MVCC的实现原理:InnoDB的MVCC的实现原理,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间或删除时间。MVCC实现类型都是有乐观并发控制和悲观并发控制。
MVCC下的SELECT、INSERT、DELETE、UPDATE是如何进行操作的:
SELECT:需要满足两个条件
1、只查询行版本号小于当前事务的版本号的行
2、查询删除版本大于当前事务的版本号的行、要么未定义的删除版本号的行
条件一确保了读取的行在读取之前就已经存在了而不是在读取更新之后的行
条件二确保了在查询之前未被删除
条件一和条件二满足了MySQL隔离级别中的可重复读
INSERT:
新插入的每一行保存当前系统版本号作为行版本号
DELETE:
每删除一行保存当前系统版本好作为删除版本号
UPDATE:
新插入的每一行保存当前系统版本号作为行版本号, 同时保存系统版本号作为原来行的删除版本(可以看做执行了一次INSERT和一次INSERT操作)
原文地址:https://www.cnblogs.com/shenyunwen/p/9374735.html
时间: 2024-10-07 23:48:25