zoukankan      html  css  js  c++  java
  • MVCC

    MVCC (Multiversion Concurrency Control),即多版本并发控制技术

    行锁+多版本 使得很小的开销就可以实现读不加锁,提高数据库的并发性


    你可将MVCC看成行级别锁的一种妥协,它在许多情况下避免了使用锁,同时可以提供更小的开销。根据实现的不同,它可以允许非阻塞式读,在写操作进行时只锁定必要的记录。


    增加两个字段 create_ver、expire_ver


    INSERT:InnoDB为这个新行记录当前的系统版本号即 create_ver = curr_ver, expire_ver不操作

    DELETE:InnoDB将当前的系统版本号设置为这一行的删除ID expire_ver = curr_ver, create_ver不操作

    UPDATE:InnoDB会写一个这行数据的新拷贝,这个拷贝的版本为当前的系统版本号。它同时也会将这个版本号写到旧行的删除版本里。
    新行 create_ver = curr_ver
    旧行 expire_ver = curr_ver

    SELECT InnoDB必须每行数据来保证它符合两个条件:
    1、InnoDB必须找到一个行的版本,它至少要和事务的版本一样老(也即它的版本号不大于事务的版本号)。这保证了不管是事务开始之前,或者事务创建时,或者修改了这行数据的时候,这行数据是存在的。
    2、这行数据的删除版本必须是未定义的或者比事务版本要大。这可以保证在事务开始之前这行数据没有被删除。这里的不是真正的删除数据,而是标志出来的删除。真正意义的删除是在commit的时候。

    WHERE create_ver<=curr_ver AND (expire_ver is null OR expire_ver>curr_ver)


    事务以排他锁的形式修改原始数据
    把修改前的数据存放于undo log,通过回滚指针与主数据关联
    修改成功(commit)啥都不做,失败则恢复undo log中的数据(rollback)

  • 相关阅读:
    电脑处理器i5和i7的区别,如何选择?
    趣漫揭秘!中国程序员生存现状?
    趣漫揭秘!中国程序员生存现状?
    程序员职业规划
    程序员职业规划
    盘点程序员开发遇到的30个问题
    盘点程序员开发遇到的30个问题
    推荐VSCode12个比较实用的插件
    Flask之模板之宏、继承、包含
    Flask之模板之控制语句
  • 原文地址:https://www.cnblogs.com/siqi/p/6690059.html
Copyright © 2011-2022 走看看