匿名用户为什么在postgresql数据库中,要规定最新的和最旧的txid不能超过21亿,从无符号2的32次方转为有符号2的31次方?
100M
是因为下面说的可以将结果转为负数小于0可以判断两个事务的大小?
我来答
添加附件
收藏
复制链接
微信扫码分享
在小程序上查看
分享
添加附件
问题补充
4条回答
默认
最新
采纳答案后不可修改和取消
我的理解是因为用的这种判断方式,所以不能超过21亿
评论
有用 2这个问题不是三言两语能解决的,百度一下"PostgreSQL事务ID回卷",仔细咀嚼一下
评论
有用 2在 PostgreSQL 数据库中,规定最新的和最旧的 txid(事务ID)不能超过21亿,这是由于事务ID的数据类型是一个32位的无符号整数。这种数据类型可以表示的数值范围是从0到4294967295(即2的32次方减1)。因此,为了避免可能的溢出问题,PostgreSQL将有效的事务ID限制在了一个更小的范围内,即从1到2147483647(即2的31次方减1)。
首先,这种限制的原因有以下几点:
1. **避免溢出**:32位无符号整数的最大值是2的32次方减1,如果事务ID达到这个值,再增加就会回绕到0,这会导致无法区分新旧事务ID,从而引发错误。
2. **预留空间**:通过将事务ID限制在2的31次方减1以内,可以为未来可能的扩展或者特殊用途预留空间。例如,某些系统内部可能会使用特殊的事务ID值来表示特定的状态或事件。
3. **简化管理**:限制事务ID的范围可以简化数据库的管理和维护工作。例如,当需要清理历史事务数据时,可以更容易地确定哪些事务ID是过时的。
4. **兼容性考虑**:在某些情况下,可能需要将事务ID转换为有符号整数进行处理,这时候2的31次方减1的范围可以确保转换后的值为正数,避免了负数的出现。
其次,为了实现这一限制,PostgreSQL采取了以下措施:
1. **初始化设置**:在数据库初始化时,会设置一个系统参数`transaction_isolation`,它决定了系统中允许的最大事务ID。这个参数默认设置为21亿,即2的31次方减1。
2. **动态调整**:虽然初始设置了最大事务ID,但PostgreSQL也允许在运行过程中动态调整这个值,以适应不同的应用场景和需求。
3. **内部检查**:在事务开始时,PostgreSQL会检查当前事务ID是否超过了设定的最大值,如果超过,则会拒绝启动新的事务,并给出相应的错误提示。
总的来说,通过这样的设计,PostgreSQL能够确保事务ID的有效管理,同时避免可能的数据溢出和混淆问题,保证了数据库的稳定性和可靠性。
评论
有用 1是的,从判断事务ID判断式( (int32)(id1 - id2 )) < 0可知,只要左边是负数,id1就比id2小。
因为有int32转换,所以前提是最新的和最旧的txid不能超过21亿,假设事务id没有出现回卷,两个事务id之差大于21亿,例如:id1=5、id2=4100000005(id1是旧事务号,id2是新事务号),id1-id2=-4100000000<0,但int32转换后就变成正数了,比较结果就变成id1>id2了;
另外一种情况,当事务ID2出现回卷,两个事务之差大于21亿,例如,id1=4100000005,id2=4100000000(id1是旧事务号,id2是新事务号),id1-id2=5>0,比较结果也变成id1>id2。
评论
有用 0回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
墨值悬赏

