2018-12-11.Mysql-MVCC

MVCC:multi-version-concurrency-control 多版本并发控制。通过多个版本的记录,减少数据行被锁定的方法。

每行记录后面保存两个隐藏的列: create-version ,delete-version。列名可能并不是真的叫这两个名字,但是这个意思。版本号会不断的递增。如开启一个事务就会递增一个版本号。

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

如:

id          name   create version   delete version

1                test                1

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

id     name   create version   delete version

1           test           1                         2

2           test2         2

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

id          name   create version   delete version

3                test2            2                          3

4、查询操作:

在查询时要符合以下两个条件的记录才能被事务查询出来,【先判断的1条件再判断2条件】:

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

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

id         name   create version   delete version

1               test            1

2               test2          2

3               test2               2                         3   

这个时候查询事务版本:4,根据1)条件应该是查询出最近的id=3的这条,又根据2)条件删除版本并没有大于当前事务版本,所以id=3这条不符合条件,结果应该是没有查询结果。

假设如果这个时候有事务4插入一条数据:

4               test3              4     

查询的事务版本:5,根据1)条件查询的应该是id=4这条,根据2)条件删除版本号未定义,所以查询的是id=4这条记录。

所以可以猜测出创建版本号和删除版本号,一定是线程安全的,每次获取到的版本号是最新的数据。这样保证了每个事务执行期间,其看到的应该是它能看到的数据。

通过对数据版本的一系列判断,减少了数据的锁操作,但并不是完全就不用锁了。

参考:https://www.cnblogs.com/dongqingswt/p/346440.html

如有错误,欢迎指正!

你可能感兴趣的:(2018-12-11.Mysql-MVCC)