李琪的技术专栏 System Research

MySql基础复习(6)---事务

2020-05-26
Clear Li

阅读:


场景

image-20200612102343125

事务的启动方式

1.begin/start transaction : 并不是一个事务的起点,再执行他们之后的第一个操作innodb数据表的语句,事务才是真的启动。一致性视图是在执行第一个快照读语句时创建的

2.start transaction with consistent snapshot :马上启动一个事务,一致性视图是在执行start transaction with consistent snapshot时创建的

两个视图

1.view。他是用来查询语句定义的虚拟表,在调用的时候执行查询语句并生成结果,

2.InnoDB在实现MVCC时用到的一致性读视图,用于支持读提交和可重复读的隔离级别

快照工作方式

1。事务开始时获取一个唯一事务ID,这个id是严格递增的

2.每行数据有多个版本 ,每个事务更新数据的时候都会生成一个新的数据版本。并且把id赋给这个数据版本记为row trx_id

3.innodb为每个事务构建一个数组,用来保存这个事务启动瞬间,当前正在活跃的所有事务id。活跃也就是事务还没有提交

4.数组里面id最小值为低水位,当前系统里面已经创建过的事务id的最大值加1记录为高水位

5.一个数据版本有以下几种可能

​ 落在低水位区域,表明当前版本已经是提交的表明这个数据是可见的

​ 落在高水位以上区域,表明这个版本是由将来的事务生成的是肯定不可见的。

​ 落在中间区域

​ 若在row trx_id数组中,表明这个版本是由没有提交的事务生成的,不可见

​ 若不在数组中,表明这个版本是已经提交了事务生成的,是可见的

6.当前读,更新数据都是先读后写的,而这个读只能读当前的值,称为当前读。如果给查询语句加锁那么也是当前读。

可重复读实现方式

在事务更新数据时,只能用当前读,如果当前记录的行锁被其他事务占用的话,就需要进入锁等待。在事务开始时会创建一个一致性视图,之后事务里的其他查询都公用这一个一致性视图

在读已提交的隔离级别下,每次更新都会重新算出一个新的视图


Similar Posts