mysql的mvcc(多版本并发控制)

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

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

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

一、在插入操做时 : 记录的建立版本号就是事务版本号。 性能

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

id   name   create version   delete version  
1 test   1  

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

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

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

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

 

三、删除操做的时候,就把事务版本号做为删除版本号。好比innodb

delete from table where id=1; table

 

id   name   create version   delete version  
1 new_value 2 3  

 

 

四、查询操做: 

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

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

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

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

经过版本号来减小锁的争用。

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

read-uncommited因为是读到未提交的,因此不存在版本的问题

而serializable 则会对全部读取的行加锁。 

 

问题1:

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

相关文章
相关标签/搜索