PostgreSQL xid速记

客户问:正常事务号小于当前事务号,且已经提交的事务可见。而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,所以是可见的)。

 

触发事务回卷的逻辑是这样的:

当事务开始的时候,发现最老的事务比自己少了2^31的时候,就进入冻结模式。因为这个时候无法判断未冻结的行,到底是可读还是不可读,如果这个事务冻结了,就直接判断为可读。

posted @ 2023-10-26 16:02  狂神314  阅读(94)  评论(0编辑  收藏  举报