这是我先前问题的简化版本。我消除了多对多的复杂性,但仍然存在死锁。它发生的频率较低,但仍然会发生。?
情况...
我有一张tweet
表,其中一列接收到一个array[]::text[]
url。
表上有一个触发器函数,可以将 url 插入url_starting
表中。
url_starting表如下所示。
CREATE TABLE public.url_starting(
id integer NOT NULL GENERATED BY DEFAULT AS IDENTITY,
url text NOT NULL,
CONSTRAINT url_starting_pk PRIMARY KEY (id),
CONSTRAINT url_starting_ak_1 UNIQUE (url)
);
推文表触发器看起来像这样。
CREATE OR REPLACE FUNCTION public.create_tweet_relationships()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
BEGIN
INSERT INTO url_starting (url)
SELECT DISTINCT UNNEST(NEW.urls)
ORDER BY 1
ON CONFLICT DO NOTHING;
RETURN NULL;
END
$function$;
有时我会遇到这样的死锁错误。
deadlock detected
DETAIL: Process 4540 waits for ShareLock on transaction 4709; blocked by process 4531.
Process 4531 waits for ShareLock on transaction 4710; blocked by process 4540.
HINT: See server log for query details.
CONTEXT: while inserting index tuple (2314,101) in relation "url_starting"
SQL statement "INSERT INTO url_starting (url)
SELECT DISTINCT UNNEST(NEW.urls)
ORDER BY 1
ON CONFLICT DO NOTHING"
PL/pgSQL function create_tweet_relationships() line 12 at SQL statement
Error causing transaction rollback (deadlocks, serialization failures, etc).
在黑暗中拍摄......?♂️
这可能是由 UNNEST 引起的吗?我在语法上做错了什么吗?
当表中没有关系时, 为什么错误说关系“url_starting” ?
有数千条推文同时提交到数据库。如果设置正确应该没关系,不是吗?