事务隔离(二)

事务隔离
1,可重复读隔离级别在事务启动时创建一个视图read-view。
1)事务执行期间数据一致,不受外界影响。
2)更新数据时需要先获得行锁,如果其他事务占用了该行的行锁,需要等待直到其他事务提交后释放行锁。

2,InnoDB在实现多版本并发控制(MVCC)时用到的一致性读视图,即consistent read view用于支持RC(读提交)和RR(可重复读)隔离级别的实现。
1)InnoDB中每个事务都有一个唯一ID:transaction id,在事务开始时向InnoDB事务系统申请,按照申请顺序严格递增。
2)每行数据有多个版本,每个版本有row_trx_id,事务更新数据时,生成一个新的数据版本,将事务的transaction id赋值给row_trx_id。
3)InnoDB为每个事务构造一个数组,保存事务启动时当前正在活跃的所有事务ID(启动了但没提交的所有事务)。
4)数组里事务ID最小值为低水位,低于该事务ID为已提交事务,当前系统创建事务ID最大值为高水位,高于该事务ID为未开始事务。

3,视图数组和高水位组成了当前事务的一致性视图(read-view):
1)当前事务更新可见;
2)低于低水位事务更新可见;
3)高于高水位事务更新不可见;
4)在高低水位之间的事务transaction id在视图数组中更新不可见;
5)在高低水位之间的事务transaction id不在视图数组中更新可见。

4,事务查询数据时获取当前记录row_trx_id,所有更新语句会生成undo log,根据以上理论执行undo log回滚到当前事务可见版本,即得到查询数据。
5,事务更新数据需要先读取当前值后再更新,不能在历史版本上更新,否则当前更新丢失,当前事务更新可见,更新数据后再查询数据可得到更新后的数据。
6,除了update语句,select语句如果加锁也是当前读,语句后加上lock in share mode读锁,加上for update写锁。

7,事务的可重复读核心是一致性读,事务更新数据时,只能用当前读,如果当前记录的行锁被其他事务占用,需要进入锁等待。
1)可重复读的隔离级别下,事务开始时创建一致性视图,之后事务中所有查询都共用这个一致性视图。
2)读提交的隔离级别下,每个语句执行前重新生成新的视图。

8,一致性视图的原则为当前事务更新总是可见的,版本未提交的不可见,版本已提交但是在视图创建后提交的不可见,版本已提交,且是在视图创建前提交的可见。
1)可重复读,查询只承认事务启动前就已经提交的数据;
2)读提交,查询只承认语句启动前已经提交的数据;
3)当前读总是读取已经提交完成的最新版本。

9,表结构不支持可重复读,因表结构没有对应行数据,没有row_trx_id,只能遵循当前读逻辑。

猜你喜欢

转载自blog.csdn.net/mei_true/article/details/127535663