You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL设置IDENTITY列CACHE大于1时是否会出现序列值跳跃问题?

问题解答

你观测到的IDENTITY列每次跳跃10的现象是CACHE 10配置导致的完全正常的行为,和PostgreSQL服务、应用是否重启没有关系。

原理说明

PostgreSQL的IDENTITY列底层依赖序列对象实现,CACHE n参数的作用是:每个数据库会话第一次访问该序列时,会一次性预分配n个连续的序列值存储在会话本地,后续该会话的序列取值请求会直接返回本地缓存的值,不需要再操作全局序列计数器,以此减少并发场景下的锁竞争,提升插入性能。

现象对应原因

  • Node API侧出现跳10:你使用的pg-promise默认启用了连接池(配置中max=20),每次插入请求可能从连接池中获取不同的连接(每个连接对应独立的数据库会话)。如果一个连接只执行了1次插入,仅用掉了预取的10个缓存值中的1个,剩下的9个会在连接释放/销毁时直接废弃,下一个新连接获取序列时会再预取10个新值,就表现为每次插入的xid间隔10。
  • pgAdmin无法复现:pgAdmin同一个查询窗口默认复用同一个数据库会话,你连续插入的操作都用的是同一份预取的缓存值,自然是连续的,和你的推测一致。

验证方法

你可以通过两个操作验证该逻辑:

  • 将IDENTITY列的CACHE参数改为1,再测试插入,xid就会变为连续无跳跃
  • 在pgAdmin中打开多个独立的查询窗口(每个窗口对应独立会话),每个窗口各执行一次插入,查询结果就会看到xid每次跳跃10

内容的提问来源于stack exchange,提问作者Jeb50

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 12:36:02