并发“如果不存在则创建表”在postgres中失败,并显示“序列已存在”错误

时间:2019-03-23 18:52:38

标签: postgresql ddl

我们有一个基于微服务的系统,其中每个微服务负责在启动时创建和升级其架构。他们所有人都使用Postgres 11 DB。

本质上,每个服务在启动时都会执行一个简单的脚本;例如:

CREATE TABLE IF NOT EXISTS SERVICE_TABLE (
    ID bigserial primary key,
    DATA JSONB
)

问题是,当部署服务的复制因子大于1时,因此同时启动了更多实例(例如在kubernates中),我们经常在日志中看到这种错误:

  

错误代码23505重复的键值违反了唯一约束   “ pg_type_typname_nsp_index”详细信息:(SERVICE_TABLE_id_seq,2200)   已经存在

脚本被执行到事务中。

似乎Postgres只能正确地处理一次表本身的创建,但是即使不应该,它也会以某种方式触发相关序列的创建。

我们错过了什么吗?这是Postgres错误/限制吗?

0 个答案:

没有答案