防止在 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_type
和prefix
。
【讨论】:
以上是关于防止在 postgres 上的异步插入重复的主要内容,如果未能解决你的问题,请参考以下文章