防止在 postgres 上的异步插入重复

Posted

技术标签:

【中文标题】防止在 postgres 上的异步插入重复【英文标题】:Prevent from duplicates on async insert on postgres 【发布时间】:2021-11-26 06:30:35 【问题描述】:

我有一个触发器,它基本上基于两列(service_type 和前缀)获取最后插入的数字(作品集),然后增加一个值。一切正常,但在某些情况下,当同时有很多插入语句时,它会导致函数使用相同的最后插入值并复制对开列

CREATE OR REPLACE FUNCTION public.insert_folio()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
DECLARE incremental INTEGER;
SELECT max(f.folio) INTO incremental FROM "folios" f
WHERE f.prefix = NEW."prefix" AND service_type = NEW."service_type";
NEW."folio" = incremental + 1;
IF NEW."folio" IS NULL THEN NEW."folio" = 1;
END IF;
RETURN NEW;
END;
$function$

CREATE TRIGGER insert_folio BEFORE INSERT ON "folios" FOR EACH ROW EXECUTE PROCEDURE insert_folio();

样本:

folio service_type prefix
1 DOCUMENT DC
1 IMAGE IMG
1 IMAGE O
2 IMAGE O
2 (This should be 3) IMAGE O

有什么想法吗? 谢谢!

【问题讨论】:

【参考方案1】:

这是因为您有同时看到相同数据的事务。在第一次提交之前,第二个事务不会看到第一个事务插入的记录。

为防止这种行为,您必须在插入时lock 整个表以防止并发写入或使用advisory locks 以防止同时插入相同的service_typeprefix

【讨论】:

以上是关于防止在 postgres 上的异步插入重复的主要内容,如果未能解决你的问题,请参考以下文章

js 防止表单异步重复提交

如何使用内部连接查询(Postgres)防止重复

Postgres - 冲突 - 如何知道是不是发生了更新而不是插入 [重复]

防止更新和插入之间的异步读取

勺子插入 postgres 会产生“重复键值违反唯一约束”

sql 忽略Postgre SQL中的重复插入