zoukankan      html  css  js  c++  java
  • mysql的mvcc(多版本并发控制)

    我们知道,mysql的innodb采用的是行锁,而且采用了多版本并发控制来提高读操作的性能。

    什么是多版本并发控制呢 ?其实就是在每一行记录的后面增加两个隐藏列,记录创建版本号和删除版本号,

    而每一个事务在启动的时候,都有一个唯一的递增的版本号。 

    1、在插入操作时 : 记录的创建版本号就是事务版本号。 

    比如我插入一条记录, 事务id 假设是1 ,那么记录如下:也就是说,创建版本号就是事务版本号。

    id   name   create version   delete version  
    1 test   1  

    2、在更新操作的时候,采用的是先标记旧的那行记录为已删除,并且删除版本号是事务版本号,然后插入一行新的记录的方式。 

    比如,针对上面那行记录,事务Id为2 要把name字段更新

    update table set name= 'new_value' where id=1;

    id     name   create version   delete version  
    1   test   1 2        
    1   new_value   2  

    3、删除操作的时候,就把事务版本号作为删除版本号。比如

    delete from table where id=1; 

    id   name   create version   delete version  
    1 new_value 2 3  

    4、查询操作: 

    从上面的描述可以看到,在查询时要符合以下两个条件的记录才能被事务查询出来: 

    1) 删除版本号 大于 当前事务版本号,就是说删除操作是在当前事务启动之后做的。 

    2) 创建版本号 小于或者等于 当前事务版本号 ,就是说记录创建是在事务中(等于的情况)或者事务启动之前。

    这样就保证了各个事务互不影响。从这里也可以体会到一种提高系统性能的思路,就是: 

    通过版本号来减少锁的争用。

    另外,只有read-committed和 repeatable-read 两种事务隔离级别才能使用mVcc

    read-uncommited由于是读到未提交的,所以不存在版本的问题

    而serializable 则会对所有读取的行加锁。 

    问题1:

    1、那我们用什么办法能看到两个隐藏列呢? 

     
     
  • 相关阅读:
    【ArcGIS 10.2新特性】ArcGIS 10.2 for Desktop 新特性(二)
    手势(Gesture)的增加和识别
    [转]C#自定义开关按钮控件--附带第一个私活项目截图
    当年的试用期周工作心得
    FREESWITCH SEESION
    基于三星ARM9(S3C2410)的交通违章抓拍系统的开发
    Apache Kafka: Next Generation Distributed Messaging System---reference
    How and Why Unsafe is Used in Java---reference
    基于keepalived对redis做高可用配置---转载
    Java获取真实的IP地址--转载
  • 原文地址:https://www.cnblogs.com/ExMan/p/10519806.html
Copyright © 2011-2022 走看看