隔离级别的实现

事务的启动方法:

  • 当启动star transaction时 并没有马上开始事务,(一致性读的情况),要到第一个执行innordb的语句才会开启事务
  • 如果是马上开启事务,star transaction with consistent snapshot.

视图的两个概念:

  • 一个是view,是查询语句定义的虚拟表,就是在执行查询结果时生成结果,create view…,查询和普通语句一致
  • innodb在mvcc中用到的一致性视图,consistent read view,支持读提交和可重复读的隔离级别实现

快照在mvcc中的实现:

  • 首先在事务启动的时候,就会生成一个快照,这个快照是基于整个库的,事务启动时会给innodb申请一个事务唯一ID,transaction_id,顺序递增,每一行数据也有多个版本,修改这行数据时,会把旧版本的数据信息保留,并把transaction_id赋值给这个数据版本的事务ID,row_transaction_id,每行数据可能有多个版本,然后就可以根据最新版本中通过row_transaction_id(最新)和undo log回推旧的版本,
  • innodb会给每个事务创建一个transaction_id的数组,里面存着这个事务启动时,当前innodb中最大的transaction_id+1 称为高水位,而自身的数据row_transaction_id 也保存进去了,最小的那个为低水位
  • 当这个事务需要到其他数据时,先看这个数据当前的版本号,超过了高水位,就不可见,根据这个数据的版本号回推到自己能用的那个版本,也就是刚好是高水位的值时就是自己能用的版本.
  • 对于修改操作来说,他会多一步操作,他会先读自己这行数据当前的值(当前读),也就是说如果在自身事务中A,有其他的修改操作已经结束(事务B在事务A启动后启动,在事务A做修改操作之前完成修改并commit,),那事务B的结果事务A可见,
  • 可重复读的核心是一致性视图,如果是查询操作,使用的视图都是事务开始时生成的那个视图,如果是修改操作,就会使用当前读.,如果当前行的行锁被其他事务占据,则会等这个行锁解锁之后才会继续本事务;

可重复读和读提交的区别:

  • 可重复读是在事务开始产生的视图,所有的查询都是根据这个视图来的
  • 读提交:每次的语句都会生成一个视图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值