事务的启动方法:
- 当启动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可见,
- 可重复读的核心是一致性视图,如果是查询操作,使用的视图都是事务开始时生成的那个视图,如果是修改操作,就会使用当前读.,如果当前行的行锁被其他事务占据,则会等这个行锁解锁之后才会继续本事务;
可重复读和读提交的区别:
- 可重复读是在事务开始产生的视图,所有的查询都是根据这个视图来的
- 读提交:每次的语句都会生成一个视图