事务间的可见性

事务内部的数据修改

对事物本身可见,对其他事务要取决于事务隔离级别。

事务间

为了描述事务间可见性,引入几个数据库内部变量。

  1. trx_id: 某个事务对聚集索引记录修改时,trx_id会记录该事务的id
  2. m_ids: 创建read_view时,已开启但未commit的事务(活跃状态事务)id集合。
  3. min_trx_id:创建read_view后,m_ids中最小id对应的事务
  4. max_trx_id:创建read_view后,数据库为下一个还未启动事务预分配的id。
  5. creator_trx_id:创建read view所在事务的id
  6. roll_pointer:当某个事务对聚集索引记录修改时,将上一个版本的记录写到undo log, 让roll_pointer指向旧版记录,通过它可以找到修改前的记录。

事物的状态

  • 已提交的事务
  • 已启动未提交的事务
  • 还未启动的事务

image

  1. 绿色区域描述了一种事务的状态,这些事务已经启动,并且已经commit了,这时只要事务的read view更新,事务间的数据的更新对彼此就是可见的(一个事务可以看到其他事务对某条记录的更新结果)
  2. 红色区域指未来需要启动的事务,该类事务对记录的更新发生在read view创建之后,所以对当前活跃状态的事务是不可见的
  3. 黄色区域需要分为两种情况讨论:1)修改了记录,但是没有commit,这种情况更新read view之后事务对数据记录的更新互相不可见。2)修改了记录,并且已经commit,在事务更新read view之后数据之间可以看到彼此对数据记录的更新

我们再来看一下前面几个变量的关系。

  1. trx_id < min_trx_id说明在read view创建前,该事务就已经commit,理所当然对当前事务可见

  2. trx_id >= max_trx_id,在read view创建之后,新启动的事务对记录的更新对当前事务不可见

  3. min_trx_id <= trx_id < max_trx_id,1) 如果某个事务已经commit,则它对该记录更新结果对当前事务可见,此时它位于绿色区域,这也说明,绿色区域的事务id不一定都比min_trx_id小; 2) 如果某事务没有提交commit,则对当前记录不可见

posted @ 2024-05-23 22:14  七块蛋糕  阅读(11)  评论(0编辑  收藏  举报