mysql事务

mysql中的两种视图

1.最常说的视图view,由一个查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果,查询方法和表一样

2.Innodb用于实现MVCC(多版本并发控制)的读一致性视图,即consistent read view,用于支持RC(读已提交)、RR(可重复读)隔离级别的实现

数据多版本

在RR隔离级别下,事务的启动相当于基于整个库拍了个“快照”

InnoDB中每个事务有一个唯一的事务id,叫做trasaction id,它在事务开始时由InnoDB系统申请,按申请顺序严格递增

而每行数据也有多个版本,每次事务更新数据的时候,都会生成一个新的数据版本,并且把当前事务的id赋给这个数据版本,记为row trx_id。同样地,每次更新会生成一条回滚日志,叫做undo log,通过当前版本和undo log就可以计算旧版本的视图

按照RR的定义,一个事务启动的时候,能看到当前所有已提交的事务,但是之后其他事务的更新对它不可见

因此,一个事务只需要声明说,某个数据版本在我启动之前生成的,就可见;在我启动之后才生成的,就不可见,必须要一直找到可见的上个版本

在实现上,InnoDB为每个事务构造了一个数组,用来保存每个事务的启动瞬间,所有“活跃”的事务id,活跃是指启动了但未提交

该数组中事务id的最小值记为低水位,而系统中已经创建过的事务id的最大值+1记为高水位

这样一个数组和高水位就组成了当前事务的读一致性视图(read-view)

于是,对于当前事务启动瞬间,一个数据版本的row trx_id,可能有几种情况:

  1. 在低水位之前:说明在当前事务启动前就已经提交或者是当前事务自己生成的,可见
  2. 在高水位之后:说明这个版本是由将来的事务启动生成的,不可见
  3. 在低水位与高水位之间:如果row trx_id在数组中,说明这个版本是由还未提交的事务生成的,不可见;如果row trx_id不在数组中,说明这个版本由已提交的短事务生成,可见

当前读

在多版本数据中,更新数据都是先读后写,这个读只能读最新的数据,称为“当前读”(current read)

除了update语句之外,select语句用 lock in share mode 或 for update 加锁也是当前读

如果当前记录的行锁被其他事务占用的话,就需要进入锁等待

而RC和RR的逻辑类似,最主要的区别在于:

  1. 在RR隔离级别下,只需要在事务开始时创建一致性视图,之后事务里的其他查询都共用这个一致性视图
  2. 在RC隔离级别下,每一个语句执行前事务都会重新算出一个新的视图

     

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值