mvcc多版本控制

MySQL的大多数事务型存储引擎都不是简单的行级锁。各大数据库基本都采用MVCC,但不尽相同。

InnoDB的简化版:(MVCC实现原理)
在每行记录后面保存两个隐藏的列来实现,一个保存了行的创建版本号,一个保存行的过期版本号(删除版本号)。

版本号:

  1. 系统版本号:每开始一个新的事务,系统版本号就会自动增加
  2. 事务版本号:事务开始时刻的系统版本号

当执行select操作时候:

  1. 只查找版本早于当前事务版本的数据行。 确保事务读取的行,在事务开始之前就存在的,或者是事务自身插入或者修改过的。
  2. 行的删除版本号要么未定义,要么大于当前事务版本号。 确保事务查询到的行,在事务开始之前没被删除。

insert操作:
为新插入的每一行保存当前系统版本号为行创建版本号。

delete操作:
为删除的行保存当前系统版本号作为行删除版本号。

update操作:
为插入一行新数据保存当前版本号作为该新行行创建版本号,同时保存当前系统版本号到原来的行作为行删除版本号。

可见update = delete+insert

采用MVCC这个原理,大多操作可以不用加锁,使得读数据操作简单,性能好,缺点是额外的存储空间消耗,更多的行检查和维护工作。MVCC只能在REPEATABLE READ 和READ COMMITTED两个隔离级别下工作。其他两个隔离级别跟MVCC不兼容。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.背景 数据库为了实现读写并行,也就是说某一行数据在修改的时候会阻塞其他线程修改但不会阻塞读,其他线程还可以...
    爱吃糖果阅读 708评论 0 0
  • 最近碰到几个业务场景,会遇到并发的问题。在单实例情况下,我们会通过java.util.concurrent包...
    菜鸟小玄阅读 2,270评论 0 5
  • MVCC概念:InnoDB使用MVCC实现高并发 MVCC并不是MySql独有的,Oracle,PostgreSQ...
    极简架构阅读 1,978评论 0 5
  • 什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点。 原子性:要不全部成功,要不全部撤销 隔...
    jiangmo阅读 1,093评论 0 3
  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 3,009评论 0 8