当前位置:网站首页>PostgreSQL source code (59) analysis of transaction ID allocation and overflow judgment methods
PostgreSQL source code (59) analysis of transaction ID allocation and overflow judgment methods
2022-07-07 07:12:00 【mingjie73】
xid Value rule
xid yes uint32 Type of ,GetNewTransactionId Function xid stay ShmemVariableCache->nextXid The value of , however ShmemVariableCache->nextXid yes long int Type of .
unsigned int : 0 ~ 4294967295 ( 0 ~ 2^32-1 )
int : -2147483648 ~ 2147483647 ( -2^31 ~ 2^31-1 )
long int : -9223372036854775808 ~ 9223372036854775807 ( -2^63 ~ 2^63-1 )
GetNewTransactionId
FullTransactionId full_xid;
TransactionId xid;
full_xid = ShmemVariableCache->nextXid;
xid = XidFromFullTransactionId(full_xid);
therefore xid The value of will be from 0 To 4294967295 Return to zero again 4294967295 Keep cycling . and ShmemVariableCache->nextXid It has been rising , because ShmemVariableCache->nextXid The range is ( -2^63 ~ 2^63-1 ).
Be careful ShmemVariableCache->nextXid To positive maximum 9223372036854775807 After adding for a while, it overflows to the minimum value of negative number -9223372036854775808, At this time, strong turns to uint32 When is 0, Another cycle .
See the following example for the rule of value taking :
ShmemVariableCache->nextXid
nextXid: 0 1 2 3 ... 4294967295 4294967296 4294967297 4294967298 ... 9223372036854775807
xid : 0 1 2 3 ... 4294967295 0 1 2 ... 4294967295
ShmemVariableCache->nextXid
nextXid: 9223372036854775807 -9223372036854775808 -9223372036854775807 ... 0
xid : 4294967295 0 1 0
ShmemVariableCache->nextXid Self adding use FullTransactionIdAdvance function
- This function starts from 0 Began to increase nextXid Value , first if Guarantee nextXid Can return to 0、1、2 Value
- rearwards nextXid Add to 4294967296 when , Will go while Loop handle 4294967296、4294967297、4294967298 The value of skips , Because these three values are converted to uint32 It will become 0、1、2, Normal business ID Do not use these three values .
- rearwards nextXid Continue to increase every time you encounter the above situation , Will go while Skip the multiples of these three numbers .
static inline void
FullTransactionIdAdvance(FullTransactionId *dest)
{
dest->value++;
/* see FullTransactionIdAdvance() */
if (FullTransactionIdPrecedes(*dest, FirstNormalFullTransactionId))
return;
while (XidFromFullTransactionId(*dest) < FirstNormalTransactionId)
dest->value++;
}
xid Size judgment rule
has TransactionIdFollows Function as an example , The input parameters are two uint32(0 ~ 2^32-1).
But when subtracting, the result is saved to diff yes int32(-2^31 ~ 2^31-1).
typedef uint32 TransactionId;
/*
* TransactionIdPrecedes --- is id1 logically < id2?
*/
bool
TransactionIdPrecedes(TransactionId id1, TransactionId id2)
{
/*
* If either ID is a permanent XID then we can just do unsigned
* comparison. If both are normal, do a modulo-2^32 comparison.
*/
int32 diff;
if (!TransactionIdIsNormal(id1) || !TransactionIdIsNormal(id2))
return (id1 < id2);
diff = (int32) (id1 - id2);
return (diff < 0);
}
- Be careful
(id1 - id2)No matter how you subtract, the result is positive , Because these are two uint32 It's decreasing . This positive result represents the distance between these two values .
The current distance -5
id1 = 4294967290u
id2 = 4294967295u
id1 - id2 = 4294967291u
diff = (int32)(id1 - id2) = -5
id2 Keep growing , however id2 yes uint32 The maximum value is 4294967295u 了 , Continue to grow and overflow
id1 = 4294967290u
id2 = 10u
id1 - id2 = 4294967280u
diff = (int32)(id1 - id2) = -16
You can see the overflow , The result is still negative ,TransactionIdPrecedes The calculation of the function is correct id1 logically < id2.
But if id1 and id2 Too much distance , exceed 2^31 after , for example id2 From just now, 10 Continue to grow to 2147483647,id2 leading id1 The distance has exceeded 2^31:
id1 = 4294967290u
id2 = 2147483647u
id1 - id2 = 2147483643u
diff = (int32)(id1 - id2) = 2147483643
result diff It turned over again and became a positive number , although id1 Logically, it should <id2, But at this moment TransactionIdPrecedes The result has been false 了 .
obviously TransactionIdPrecedes Function calculation error .
summary
So in PG The existing xid Distribution mechanism , In order to ensure xid After rewinding, you can also compare the size correctly , Two xid The distance cannot exceed 2^31.
Convenient memory : Business ID You can roll back , But the distance from the oldest to the latest cannot exceed 20 Billion , Otherwise, a second symbol flip will occur , Business ID All the calculation results will be wrong .
边栏推荐
- Détailler le bleu dans les tâches de traduction automatique
- 关于二进制无法精确表示小数
- Brand · consultation standardization
- MOS tube parameters μ A method of Cox
- Initial experience of addresssanitizer Technology
- sql中对集合进行非空校验
- DHCP路由器工作原理
- IP address
- toRefs API 与 toRef Api
- Fast quantitative, abbkine protein quantitative kit BCA method is coming!
猜你喜欢

Reflection (II)

Matlab tips (30) nonlinear fitting lsqcurefit

MOS tube parameters μ A method of Cox

Sword finger offer high quality code

LVS+Keepalived(DR模式)学习笔记

Comment les entreprises gèrent - elles les données? Partager les leçons tirées des quatre aspects de la gouvernance des données

Jesd204b clock network

虚拟机的作用

Mysql---- import and export & View & Index & execution plan

$parent (get parent component) and $root (get root component)
随机推荐
How DHCP router works
Prime partner of Huawei machine test questions
Bus message bus
2022年全国所有A级景区数据(13604条)
At the age of 20, I got the ByteDance offer on four sides, and I still can't believe it
readonly 只读
Nesting and splitting of components
Answer to the first stage of the assignment of "information security management and evaluation" of the higher vocational group of the 2018 Jiangsu Vocational College skills competition
How can clothing stores make profits?
云备份项目
Please answer the questions about database data transfer
Databinding exception of kotlin
LC interview question 02.07 Linked list intersection & lc142 Circular linked list II
【JDBC以及内部类的讲解】
.net 5 FluentFTP连接FTP失败问题:This operation is only allowed using a successfully authenticated context
ViewModelProvider. Of obsolete solution
Kuboard无法发送邮件和钉钉告警问题解决
Please tell me how to monitor multiple schemas and tables by listening to PgSQL
Config分布式配置中心
Data of all class a scenic spots in China in 2022 (13604)