mysql之事务实现方式-MVCC

mysql之事务实现方式-MVCC

什么是MVCC

MVCC是mysql的的多版本并发控制即multi-Version Concurrency Controller,mysql的innodb引擎支持MVCC,在事务级别为RR(可重复读)和RC(读提交)生效。

工作原理

实现原理借助3个隐藏字段、undo log、read view实现

3个隐藏字段

数据库表的引擎为innodb时,都会为每行数据添加3个隐藏字段。

  1. DB_ROW_ID:包含一个行ID,该行ID随着插入新行而增加,如果有唯一键,这个隐藏字段不会被创建。

  2. DATA_TRX_ID:插入或更新该行的最后一个事务的事务标识符。删除在内部被视为更新,在该更新中,行中的特殊位被设置为将其标记为已删除。

  3. DATA_ROLL_PTR:滚动指针。innodb通过这个指针找到之前的版本的数据,该行版本的数据在undo log中是以链表形式存在的。

undo log

undo log是回滚日志,它可以保证事务的原子性,也记录了数据多个事务版本。当多个事务对同一个数据进行修改时,每开启一个事务,被操作的数据会生成一条临时数据,隐藏字段DATA_TRX_ID的值为当前事务的事务id,并将这些临时数据已链表的形式存入undo log日志中,DATA_ROLL_PTR的值指向undo log链表中具体回滚的数据。undo log是逻辑日志,和redo log一样也会写入磁盘,undo log的日志的清理由具体的线程管理。

read view

consistent read view:一致性视图,为某一时刻事务系统(trx_sys)的快照,之后的读操作根据当前事务id与快照中事务系统状态做比较,判断数据对事务的可见性。

trx_sys状态

名称说明
rw_trx_idsx当前read view创建时还在运行的事务id列表
min_trx_id最小事务id,rw_trx_ids中最小的id
max_trx_id最大事务ID,当前系统中已经生成的最大事务ID+1,即下一个要生成的事务ID
creator_trx_id当前事务id

数据可见性规则:

  1. 一行数据的trx_id = creator_trx_id,表示数据是由当前事务修改的,可见。

  2. 一行数据的trx_id < min_trx_id,表示数据在事务创建之前修改的,可见。

  3. 一行数据的trx_id >= max_trx_id,表示数据在事务创建之后修改的,不可见

  4. 一行数据的trx_id大于等于min_trx_id且小于max_trx_id,如果trx_id在rw_trx_ids列表中,表示该事务还未提前,不可见;否则可见。

隔离级别为read commited时每次读取数据都生成一个快照读,所以能看到其他事务已提交的数据;repeatable read是每次开启事务生成一个快照读。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值