暂无图片
为什么在postgresql数据库中,要规定最新的和最旧的txid不能超过21亿,从无符号2的32次方转为有符号2的31次方?
我来答
分享
暂无图片 匿名用户
为什么在postgresql数据库中,要规定最新的和最旧的txid不能超过21亿,从无符号2的32次方转为有符号2的31次方?


是因为下面说的可以将结果转为负数小于0可以判断两个事务的大小?

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
BAZINGA...

我的理解是因为用的这种判断方式,所以不能超过21亿

暂无图片 评论
暂无图片 有用 2
打赏 0
一般

这个问题不是三言两语能解决的,百度一下"PostgreSQL事务ID回卷",仔细咀嚼一下

暂无图片 评论
暂无图片 有用 2
打赏 0
浅默
在 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
打赏 0
清风生

是的,从判断事务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
打赏 0
大树666
2024-05-07
请问你举的第二个例子是说id1套了id2一圈?是不是id1已经执行了42亿+41亿次?
回答交流
Markdown


请输入正文
提交
相关推荐
postgresql有大量的idle连接怎么办?
回答 1
使用数据库连接池pgbouncer数据库在没有任何连接池的情况下,应用程序必须直接访问数据库来建立连接。打开一个连接会产生消耗,关闭一个连接也会产生消耗,而这样的消耗,伴随着你打开的连接越多,则消耗的
从oracle迁移到postgresql,表结构不同,如何迁移?
回答 4
已采纳
首先,肯定得映射oracle与postgresql的字段类型。然后你可以采用土办法,从oracle导出表结构,然后人工替换修改。或者你自己写SQL,将建表语句摘出来将类型替换成postgresql对应
入门者求问:怎么把sql文件导入postgresql数据库?
回答 1
已采纳
psqlmydbpguserftestdb.sql
postgreSQL 逻辑复制订阅端表变化怎么监控?
回答 1
看日志
Oracle中,除了ROLLBACK,什么情况会导致事务回滚?
回答 2
在Oracle数据库中,除了显式调用ROLLBACK指令以外,还有以下情况会导致事务回滚:程序异常当程序在事务执行过程中遇到未处理的异常(如数据库连接断开、查询语法错误),事务会自动回滚。死锁(Dea
pg中标识一个sql语句的唯一性,通过哪个系统表的哪个字段?
回答 3
PostgreSQL14以上版本,可以使用&nbsp;pgstatactivity&nbsp;系统视图queryid&nbsp;这个后端的最近查询的标识符。
有一个postgreSQL实例, 表很大, 几千万行有10几个 cpu 和 mem 消耗 10%和40%,locks能到 1万5。 这个实例可能是因为什么原因, 造成服务能力上不去?
回答 1
有慢SQL
pg_ctl reload的问题
回答 2
只是加载配置文件,不影响实例。使用“pgctlreload”命令或直接调用函数“pgreloadconf()”时,其本质都是发送SIGHUP命令给服务主进程。
postgresql copy 文件必须放在服务器上吗?
回答 1
通常是这样,当然也可以放在ftp或者NAS共享盘中,只要PG能访问到即可。
pg_filenode.map 这个文件在什么位置??
回答 1
对于PostgreSQL中的每张表在磁盘上都有与之相关的文件,而这些文件的名字便是relfilenode,我们可以通过pgclass的relfilenode字段去查询。selectoid,relnam