【问题标题】:Prevent from duplicates on async insert on postgres防止在 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

有什么想法吗? 谢谢!

【问题讨论】:

    标签: database postgresql function triggers auto-increment


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-07
      • 2016-02-19
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 2018-04-11
      相关资源
      最近更新 更多