MySQL和TiDB的多版本并发控制「MVCC」对比

一、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;

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

数据库标签