一、MVCC概述
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种并发控制机制,它的操作是基于快照而非锁定的,这种机制可以使多个数据库事务并发地访问服务器中的数据,同时又不会相互干扰,从而实现数据并发控制。
在MVCC模型中,通过保存旧版本的数据快照来支持事务的并发执行,每个事务可以看到一个特定版本的数据,这也是该模型在允许高并发的同时,保持了访问一致性。
二、MySQL的MVCC实现
1. MVCC的实现方式
MySQL中实现MVCC主要依靠两个机制:Undo记录和Read View。
当一个事务修改数据时,MySQL会为该数据生成一个Undo Record,用来记录该修改的历史记录。同时MySQL也会为每个事务创建一个Read View,其作用是用来过滤出可见的数据快照,从而使得每个事务看到的数据版本是稳定的。
2. MVCC的缺陷
MySQL中MVCC机制的缺陷在于,如果系统中出现大量长事务,会导致Undo记录无法及时的被回收和释放,从而引起严重的性能问题。
当然,MySQL也提供了参数innodb_undo_log_truncate开关,可以启用一定程度的Undo记录自动清理机制,但该机制仍然存在着The Hitchhiker's Guide to the Galaxy(银河系漫游指南)的极端情况,即:长事务活得比我们所有人都长。
三、 TiDB的MVCC实现
1. TiDB的MVCC实现方式
TiDB也是采用类似MySQL的MVCC模型,但采用了无锁算法来避免长事务产生。具体实现如下:
1)对于快照读,TiDB在每个副本节点上都保存了一个基于时间戳的快照版本,同时维护了多个不可变的revision以保证数据的一致性。
2)对于修改操作,TiDB每次会从最新的revision中读出所需数据,然后在自身节点中进行修改,并将修改结果立即提交到Raft协议。
2. TiDB的优势
相比MySQL,TiDB的无锁实现可以避免长事务的产生,即使出现长事务,也不会导致大量占用Undo空间,从而改善了MySQL MVCC模型的性能缺陷。
四、 总结
虽然MySQL和TiDB都采用了MVCC模型来支持数据的并发访问和事务控制,但两种实现方式有着不同的优劣势。MySQL MVCC模型存在着Undo空间占用和清理的问题,而TiDB的无锁实现能够很好的避免长事务的产生,从而避免这些问题。
综上,对于高并发、大数据场景下的数据库应用,TiDB的无锁实现有着更好的性能表现和更高的并发能力。
#此处示例SQL语句
#创建表
CREATE TABLE test (id INT PRIMARY KEY, name VARCHAR(50), balance INT) ENGINE = InnoDB;
#测试区间锁定
BEGIN; SELECT * FROM test WHERE id > 5 AND id < 10 FOR UPDATE;
#查询当前事务可见版本
SELECT @@TX_ISOLATION;