我有一个PostgreSQL 14.7数据库,它有多个客户端,可以自动为表创建和删除分区。其中一个客户端无法创建表分区,它得到了一个42P07 duplicate_table
错误:
关系“prc_739214”已存在
尽管它执行的查询类似于CREATE TABLE IF NOT EXISTS prc_739214 PARTITION OF prc FOR VALUES FROM ... TO ...;
。我希望IF NOT EXISTS
可以防止duplicate_table
错误,但显然它们仍然可能发生。
有没有什么方法可以加强这个查询以避免duplicate_table
错误?
作为参考,客户端收到来自epgsql
(Erlang PG客户端库)的以下错误:
{error,
error,
<<"42P07">>,
duplicate_table,
<<"relation \"prc_739214\" already exists">>,
[{file,<<"heap.c">>},
{line,<<"1200">>},
{routine,<<"heap_create_with_catalog">>},
{severity,<<"ERROR">>}
]}
字符串
1条答案
按热度按时间ct3nt3jp1#
IF NOT EXISTS是用来处理幂等性的,而不是并发性的。如果两个会话试图同时创建同一个表,其中一个仍然会出错。
我不希望它是this错误,但是通过一个简单的测试,我看到在表是分区的情况下,确实这是错误的表现方式。
因此,为了防止这种情况,您需要使用某种锁来防止多个会话同时尝试创建同一个表。最好的方法取决于我们不了解的程序内部工作原理。可能是初始表名的哈希值上的建议锁,也可能是分区树的父表上的某种互斥锁。