事务隔离(二)

事务隔离
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,只能遵循当前读逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值