事务内部的数据修改
对事物本身可见,对其他事务要取决于事务隔离级别。
事务间
为了描述事务间可见性,引入几个数据库内部变量。
- trx_id: 某个事务对聚集索引记录修改时,trx_id会记录该事务的id
- m_ids: 创建read_view时,已开启但未commit的事务(活跃状态事务)id集合。
- min_trx_id:创建read_view后,m_ids中最小id对应的事务
- max_trx_id:创建read_view后,数据库为下一个还未启动事务预分配的id。
- creator_trx_id:创建read view所在事务的id
- roll_pointer:当某个事务对聚集索引记录修改时,将上一个版本的记录写到undo log, 让roll_pointer指向旧版记录,通过它可以找到修改前的记录。
事物的状态
- 已提交的事务
- 已启动未提交的事务
- 还未启动的事务
- 绿色区域描述了一种事务的状态,这些事务已经启动,并且已经commit了,这时只要事务的read view更新,事务间的数据的更新对彼此就是可见的(一个事务可以看到其他事务对某条记录的更新结果)
- 红色区域指未来需要启动的事务,该类事务对记录的更新发生在read view创建之后,所以对当前活跃状态的事务是不可见的
- 黄色区域需要分为两种情况讨论:1)修改了记录,但是没有commit,这种情况更新read view之后事务对数据记录的更新互相不可见。2)修改了记录,并且已经commit,在事务更新read view之后数据之间可以看到彼此对数据记录的更新
我们再来看一下前面几个变量的关系。
-
trx_id < min_trx_id说明在read view创建前,该事务就已经commit,理所当然对当前事务可见
-
trx_id >= max_trx_id,在read view创建之后,新启动的事务对记录的更新对当前事务不可见
-
min_trx_id <= trx_id < max_trx_id,1) 如果某个事务已经commit,则它对该记录更新结果对当前事务可见,此时它位于绿色区域,这也说明,绿色区域的事务id不一定都比min_trx_id小; 2) 如果某事务没有提交commit,则对当前记录不可见