本文共 1169 字,大约阅读时间需要 3 分钟。
MVCC(Multi-Version Concurrency Control,多版本并发控制器)是一种数据库Concurrency Control(并发控制)的机制,主要用于解决多版本并发控制下的读写冲突问题。它通过版本控制和一致性视图的机制,允许多个事务在同一时间对数据库进行读写操作,而不互相阻塞,有效避免了脏读和不可重复读等问题。
MVCC的核心在于理解undo log(回滚日志)版本链和read view(一致性视图)两个关键概念。
在数据库执行更新操作时,会生成undo log(回滚日志),并记录事务操作的相关信息。事务提交后,数据库会保留修改前的undo log日志,同时维护两个隐藏字段:trx_id(事务ID)和roll_pointer(回滚指针)。这些字段将多个undo log日志串联起来,形成一个版本链,记录事务操作的历史信息。
Read view是用来维护事务可见性的机制。它记录当前未提交的事务ID,并保存当前最大的事务ID。例如,如果有三个事务ID为100、200、300,其中300已经提交,那么生成的read view就是[100, 200], 300。
MVCC通过read view进行可见性分析,确定当前事务能够读取的数据。具体规则如下:
在可重复读隔离级别下,MVCC确保事务的读一致性。每次SELECT操作都会生成新的read view,确保读到的数据是其他事务已提交的版本,有效避免脏读。同时,更新操作会直接使用最新数据,并记录trx_id到undo log中,确保一致性。
删除操作会在undo log中记录为特殊的版本记录。数据库在查询时会检查delete_flag标记位,如果标记位为true,则忽略该记录,避免数据混乱。
MySQL不会在事务开始时分配事务ID,而是从第一次执行更新操作或加锁操作时开始递增分配。因此,事务ID是有序递增的。
MVCC通过版本链和一致性视图的机制,有效管理多版本并发控制下的读写冲突,确保数据库事务的高效执行和一致性。
转载地址:http://geffk.baihongyu.com/