MST

星途 面试题库

面试题:PostgreSQL可见性判断机制中事务ID的作用

请阐述在PostgreSQL可见性判断机制里,事务ID(Transaction ID)是如何参与到数据行可见性判断过程中的,包括不同事务状态下对数据行可见性判定的影响。
19.8万 热度难度
数据库PostgreSQL

知识考点

AI 面试

面试题答案

一键面试

在PostgreSQL可见性判断机制中,事务ID在数据行可见性判断过程扮演关键角色:

  1. 事务状态与数据行可见性判定的影响
    • 活跃事务
      • 活跃事务创建的数据行,对于本事务内的后续操作是可见的。例如,事务T1插入了一行数据,在T1提交或回滚前,T1内的查询可以看到这行新插入的数据。
      • 对于其他并发活跃事务,该行数据不可见。比如事务T2在T1活跃时进行查询,看不到T1插入的未提交数据,这确保了事务的隔离性。
    • 已提交事务
      • 已提交事务创建的数据行,对所有后续事务(包括刚刚提交事务之后启动的事务)都是可见的。例如事务T1提交后,后续启动的事务T2能看到T1插入的数据。
    • 回滚事务
      • 回滚事务创建的数据行对所有事务都不可见。假设事务T1插入数据后回滚,那么无论是T1本身后续操作,还是其他事务,都无法看到T1回滚前插入的数据,就好像这行数据从未存在过一样。
  2. 事务ID参与数据行可见性判断过程
    • 每个数据行都有两个重要的事务ID相关字段,即xmin(创建该行的事务ID)和xmax(删除或更新该行的事务ID,若未删除或更新则为0)。
    • 查询时判断逻辑
      • 当一个事务进行查询时,对于每一行数据,首先检查xmin。如果xmin对应的事务是活跃的且不是当前查询事务本身,那么该行数据不可见。例如事务T2查询时,遇到xmin为活跃事务T1的ID的数据行,T2看不到该行数据。
      • 如果xmin对应的事务已提交,那么继续检查xmax。若xmax为0或者xmax对应的事务已回滚,那么该行数据可见。比如xmin为已提交事务T1的ID,xmax为0,此时该行数据对查询事务可见。若xmax对应的事务是活跃的,那么该行数据不可见。
      • xmin对应的事务已回滚,那么该行数据不可见,无论xmax的值是什么情况。