PostgreSQL 13中同一查询内两次nextval调用是否具有确定性?
PostgreSQL序列调用的原子性问题
场景说明
在PostgreSQL 13环境下,现有:
- 名为
example_sequence的序列 - 仅包含两个bigint字段
val1和val2的example_table表
执行插入语句:
insert into example_table (val1, val2) values (nextval('example_sequence'::regclass), nextval('example_sequence'::regclass));
问题解答
- 新增行的
val2始终保证等于val1 + 1 - 不会出现其他会话的
nextval调用插入到这两次调用之间的情况,val2绝不会大于val1 + 1
原因在于:
- PostgreSQL中,同一条SQL语句内的多个
nextval调用是连续且原子执行的,序列值的获取过程不会被其他会话打断。序列的nextval操作本身是线程安全的,同一条语句里的多次调用会按顺序拿到连续的序列值,外部会话的序列调用无法插入到这两次调用之间。
内容的提问来源于stack exchange,提问作者user2943799
相关产品推荐
相关产品推荐

