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的时候,就进入冻结模式。因为这个时候无法判断未冻结的行,到底是可读还是不可读,如果这个事务冻结了,就直接判断为可读。
严以律己、宽以待人
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~