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
如有错误,欢迎指正!