对事务号的冻结的理解

xiaobu 13天前 21

这块知识是学习PG过程中比较难的一个知识点,我把我的理解写在下面,希望对你有所帮助。


首先理解两个概念:“生日”(birthday)和“年龄”(age)。这是两个紧密联系但又不同的概念。假设小明出生在2000年9月8日,今天是2025年9月8日,则小明的生日是2000年9月8日,他的年龄是25岁,即当前日期减去他的生日。这两个概念非常容易理解。

我们说小明的爸爸比小明“老”(old),那是因为小明爸爸的生日在小明生日之前。当A的生日在B生日之前,即A的生日所表示的数值比B生活所表示的数字小,则我们称A比B老。

现在我们对“生日”、“年龄”和“老”的概念有了清晰的理解。类似的,PG的事务(transaction)也存在这三个概念。

我们知道在PG中每发起一个事务,系统就会自动为这个事务分配一个事务号(transaction id,或者叫XID),这是一个整数,由四字节的无符号整数所表示,范围从0到0xFFFFFFFF。这其中的0、1和2三个事务号作为特殊的事务号,被排除在外。当事务号增大加到最大值0xFFFFFFFF以后,下一个事务号就是3,这个现象被称为transaction id wraparound。再下一个事务号是4,如此不断累积和循环。

一个事务的事务号就是该事务的生日。如果一个事务的事务号是5,则5就是这个事务的生日。

当前事务号(current transaction id),就是最近一次发生的事务的事务号,譬如当前事务号是991,下一次事务的事务号是992,就是下次事务发生时的当前事务号。当前事务号是不断增加的。

如果某事务T的事务号是5,当前事务号是991,则T的年龄(transaction age)就是986,即991 - 5。所以事务的生日(即事务号)和事务的年龄和人的生日和年龄非常类似。

 

如果一个事务T1的事务号是5,另外一个事务T2的事务号是6,则称T1比T2老,T2比T1年轻。

 

 

 

最新回复 (0)
返回
发新帖