mysql多版本并发控制MVCC的实现

  


  

        集全球事务隔离级别读取提交;//全局的   设置会话事务隔离级别读取提交;//当前会话      


  

        设置自动提交=1;//自动提交,为0手动提交      


  

  

innodb
  

  

说明:   

InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存行的过期时间(或删除时间)。当然存储的并不是实际的时间值,而是系统版本号(系统版本号)。每开始个新的事务,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的
  

  

选择
  

  

InnoDB会根据以下两个条件检查每行记录:
  

  

。InnoDB只查找版本早于当前事务版本的数据行(也就是,行的系统版本号小于或等于事务的系统版本号),这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插人或者修改过的。
  

  

b。行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前未被删除。
  

  

只有符合上述两个条件的记录,才能返回作为查询结果。
  

  

插入
  

  

InnoDB为新插人的每行保存当前系统版本号作为行版本号。
  

  

删除
  

  

InnoDB为删除的每行保存当前系统版本号作为行删除标识。
  

  

更新
  

  

InnoDB为插人行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识。
  

  

注意:
  

  

MVCC只在可重复读和读对两个隔离级别下工作。其他两个隔离级别都和MVCC不兼容法,因为阅读UNCOMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。而序列化则会对所有读取的行都加锁。

  


  

        显示表状态像‘任务’\ G;   之前      

  

脏读:当前事务读到了另一个事务未提交的状态,事务没有实现隔离。
  

  

不可重复读:实现了事务的隔离性,但两次读取同一条数据的时候发现数据不一致了。
  

  

幻读:两次查询同一批数据,发现有新数据被插入,主要是因为中途有其他事务对数据集进行了插入操作。(加了间隙锁解决该问题)
  

  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

mysql多版本并发控制MVCC的实现