Mysql多版本并发控制(MVCC)

Mysql多版本并发控制(MVCC)

MVCC是个行级锁变种,他在普通读情况下避免了加锁操作,因此开销更低。实现了非阻塞读,对于写操作只锁定必要的行。

  • 一致性读(就是读取快照)
    select * from table .....;

  • 当前读(就是读取实际的持久化的数据)
    特殊的读操作,插入/更新/删除操作都属于当前读,处理的都是当前的数据,需要加锁。

    select * from table where ? lock in share mode;
    select * from table where ? for update;
    insert;
    update ;
    delete;
    
  • InnoDB通过在每行数据后边保存两个隐藏的列来实现(其实有三列,第三列用于事务回滚)
    第一列保存了行的创建版本号,第二列保存了行的更新版本号。这个版本号是每个事务的版本号,递增的。

select无锁操作与维护版本号

  • Select (快照读,就是读取当前事务之前的数据)
    1、InnoDB只select查找版本号早已当前版本号的数据行,这样保证了读取的数据要么是在这个事务开始之前commit的,要么是这个事务自身中执行创建操作的数据(等于当前版本号)
    2、查找行的更新版本号要么未定义,要么大于当前版本号,保证了事务读取到在当前事务开始之后的未被更新的数据。
  • Insert
    InnoDB为这个事务中新插入的行,保存当前事务版本号的行作为行的行创建版本号。
  • Delete
    InnoDB为每一个删除的行保存当前事务版本号,作为行的删除标记。
  • Update
    将存在两条数据,保持当前版本号作为更新后的数据的新增版本号,同时保存当前版本号作为老数据行的更新版本号。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容