数据库并发多版本控制mvcc


如果严格采用数据库三级封锁协议,采用第二第三级封锁协议时,读写数据加锁,数据库的读操作会被阻塞,在读写并发访问量高的场景下读操作性能会急剧下降,为提高高并发场景下数据库的读性能,数据库一般采用并发多版本控制(mvcc)来实现。
mvcc是一种不利用锁机制实现的隔离,主要实现了在保证数据一致性的前提下实现数据的续写并行
数据库会为每条记录增加三个字断,创建时间戳(事务号),删除时间戳,回滚日志地址,数据的创建会把当前事务号写入插入时间戳,每条数据的更新会以标记删除,在删除时间戳写上当前事务号,新插入一条数据,插入时间戳写上当前事务号,每条数据存在多个版本。

mvcc查询需要遵循以的规则

1.只查 创建时间比当前时间小,删除时间比当前时间大的数据,插入时间比当前时间大或删除时间比当前时间小的数据对当前事务不可见。确保只查数据库已提交事务数据。
2.更新只更新最新的版本数据
3.更新数据时加锁。插入一条创建时间为当前事务时间标记的记录,在原数据删除事务时间打上当前事务时间标识。

mvcc适用场景

可重复读事务级别,mvcc完全符合,读可提交事务级别,mvcc部分符合,脏读与序列化度与mvcc完全不符。

在理想的mvcc是很难实现的,多个版本书库同时存在容易相互覆盖,导致事务型数据库不满足aicd事务特性,因此数据库在做更新操作时会上锁。保证两个写事务之间互斥,不会相互覆盖。在mvcc中加锁与mvcc定义不是很相符,只能说目前数据库实现的,mvcc都存在局限性,真正的mvcc是一种理想状态。

mvcc查询数据细节

如果查询只遵循查找创建时间比当前事务小,删除时间比当前事务时间大的数据,还存在以下问题,
1.如何保证查询的数据已提交,查询到脏数据是不可以的
2.如何保证可重复读。

针对第一个问题数据库会有一张活跃事务表,每次创建新事务时拷贝一份当前活跃事务副本,记最小事务为Tmin,最大事务为Tmax,当前数据行事务为T.执行查询时遍历结果集,
1.如果当前行事务T<Tmin,说明说明T事务前面的事务都已经提交,返回当前行数据。
2.如果当前行事务T>Tmax,说明当前数据行是在当前事务创建后生成的,数据不可见,根据回滚指针字段找到上一版本数据,从新比较事务时间大小。
3.如果当前行事务 Tmin<T<Tmax. 遍历当前活跃事务副本,如果T为活跃事务列表中的某值,说明该数据行未提交数据,根据数据回滚指针找到上一版本数据,从新比较数据,反之则说明该数据为当前事务修改,对当前事务可见,返回数据行。

事务级别为读已提交时每次查询都拷贝一份当前活跃事务副本即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值