MVCC 版本控制

MVCC 版本控制

事务的隔离级别

  • 读未提交 ->会有脏读
  • 读已提交->会有不可重复读(在一个事务内查询到不同的结果)
  • 可重复读->会有幻读(事务 A 根据条件查询得到了 N 条数据,但此时事务 B 删除或者增加了 M 条符合事务 A 查询条件的数据,这样当事务 A 再次进行查询的时候真实的数据集已经发生了变化,但是A却查询不出来这种变化,因此产生了幻读。)
  • 串行化

读未提交没有用到MVCC 串行化用了表锁是并发控制最强但是效率最低的

Mvcc组成

  • undo log版本链
  • 隐藏列
  • readView(快照)

隐藏列

# 此处有图片 3

  1. DB_TRX_ID – 记录插入或更新该行的最后一个事务的事务 ID
  2. DB_ROLL_PTR – 指向改行对应的 undo log 的指针,最新的历史数据
  3. DB_ROW_ID – 单调递增的行 ID,他就是 AUTO_INCREMENT 的主键 ID

undo log版本链

存储该行的历史数据

image-20240711211944115

ReadView

读已提交每次查询都会创建一个readview

image-20240711212005175

当前事务id

最小事务id(未提交的)

最大事务id(还没开始)

从版本链里面找符合的那一条记录,从最新的版本链开始比较链中的事务id和readView里面的事务集合比较。

读已提交和可重复读的区别是

读已提交是每次查询时候创建一个快照,可重复读是第一次创建readview

可见性算法

1,如果数据行的事务id小于Read View最小事务id,则该行数据对当前事务可见。

2,如果数据行的事务id>=Read View中记录的当前出现的最大事务id+1,则跳转步骤5执行。

3,事务id列表为空,则该行数据可见。

4,如果数据行的事务id大于等于Read View最小事务id,并且
小于Read View中记录的当前出现的最大事务id+1。

判断若存在于活跃事务id列表,则不可见。
判断若不存在于活跃事务id列表,则可见。

5,根据回滚指针在undo log中取出一条记录,从1步骤重复判断,直到找到满足条件的记录,否则返回空。

image-20240714183408475

可见性算法参考链接:https://blog.csdn.net/weixin_43073775/article/details/121384273

MVCC(Multi-Version Concurrency Control)是一种并发控制技术,主要用于数据库管理系统中处理并发事务的冲突。MVCC允许事务在读取数据时不会被其他事务修改,从而实现了更高的并发性和隔离级别。 在MVCC中,每个事务操作的数据都有多个版本。当一个事务开始时,它会创建一个事务开始时间戳,并且只能看到在该时间戳之前提交的数据版本。而其他事务对同一数据进行修改时,会创建新的数据版本,并将其与修改事务的开始时间戳关联。 基于MVCC的并发控制可以通过以下方式实现: 1. 读操作:在读取数据时,事务只能看到早于其开始时间戳的已提交版本。这样可以避免脏读和不可重复读的问题。 2. 写操作:当一个事务进行写操作时,会创建一个新的数据版本,并将其与该事务的开始时间戳关联。其他事务在该事务提交之前只能看到旧版本的数据。 3. 事务隔离级别:MVCC可以支持不同的事务隔离级别,如读未提交、读已提交、可重复读和串行化。这些隔离级别可以根据应用程序的需求进行配置。 MVCC的优点是能够提供更高的并发性和隔离级别,减少了锁的冲突和等待时间。然而,它也会增加存储空间的开销,因为每个数据版本都需要保存。此外,MVCC可能导致长事务持有过多的旧版本数据,增加了垃圾回收的复杂性。 总的来说,MVCC是一种强大的并发控制技术,可以提高并发性和隔离级别,但需要权衡存储空间和垃圾回收的开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值