PostgreSQL xid速记

发布时间 2023-10-26 16:09:59作者: 狂神314

客户问:正常事务号小于当前事务号,且已经提交的事务可见。而txid回卷,txid是固定的21亿,如果超过了临界值,比如1-21亿 如果在txid=21亿,下一个txid=1 那么 1是未来的,而txid 21亿是过去的,但1比21亿小,如何判断可见性。

1)先判断行的xid是否为普通事务号,如果不是,则认为该行是比任何普通事务都要旧,任何查询都是可以读的。(0、1、2 三个特殊事务号,其中0表示无效事务号,1表示初始事务号,2表示冻结事务号)

2)然后判断:当查询语句的xid-行xid < 0 的时候,认为不可见。xid是32位的,理论上是接近40亿,但查询语句的xid-行xid的结果是一个有符号的int32类型,有一位表示符号位,因此 (2^31+100) - 5 = 是一个负数,会认为不可见。因此在当前xid的后面2^31,接近21亿的事务是可见的(相减后小于2^31,正数);当前xid前面2^31个事务是不可见的。(前面2^31+1事务号,属于后面2^31-1,所以是可见的)。