MVCC多版本并发控制

MVCC多版本并发控制

MVCC是在并发访问数据库时,通过对数据做多版本管理,避免因为写锁的阻塞而造成读数据的并发阻塞问题。

 

1,和version思想差不多,innoDB下,开启一个事务,mysql的表对应有3个隐藏列

DB_TRX_ID: 记录操作该数据事务的事务ID;

DB_ROLL_PTR:指向上一个版本数据在undo log 里的位置指针;

DB_ROW_ID: 隐藏ID ,当创建表没有合适的索引作为聚集索引时,会用该隐藏ID创建聚集索引;

 

2.在开启事务修改的时候,会把原数据存进undo log里面,并把存的指针存在隐藏列DB_ROLL_PTR上,
同时这个DB_TRX_ID会加一,跟版本号一样一样的思想。

 

3.发送提交的时候,之间提交就好,回滚的时候从隐藏列找到对应的undo log数据回滚。

 

undo log 具体怎么回滚事务 ? 举个例子:

insert:会在 undo log 中记录下方才你 insert 进来的数据的 ID,当你 想 roll back 时,根据 ID 完成精准的删除。

delete:会在 undo log 中记录方才你删除的数据,当你回滚时会将删 除前的数据 insert 进去。

update:会在 undo log 中记录下修改前的数据,回滚时只需要反向 update 即可。

select:别费心了,select 不需要回滚。

 

read view

在innodb 中每个事务开启后都会得到一个read_view。副本主要保存了当前数据库系统中正处于活跃(没有commit)的事务的ID号,其实简单的说这个副本中保存的是系统中当前不应该被本事务看到的其他事务id列表。

 

详细请看:

https://zhuanlan.zhihu.com/p/52977862

posted @ 2022-04-12 19:34  java架构师1  阅读(43)  评论(0)    收藏  举报