Esta é uma versão simplificada da minha pergunta anterior . Eu removi a complexidade de muitos para muitos e ainda impasses. Isso acontece com menos frequência, mas ainda acontece. ?
A situação...
Tenho uma tweet
tabela e uma das colunas recebe uma array[]::text[]
das urls.
Há uma função de gatilho na tabela que insere as urls em uma url_starting
tabela.
A tabela url_starting se parece com isso.
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)
);
E a tabela de tweets, o gatilho se parece com isso.
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$;
Às vezes eu recebo erros de deadlock como este.
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).
Tiros no escuro... ?♂️
Isso pode ser causado pelo UNNEST? Estou fazendo algo errado na sintaxe?
Por que o erro diz em relação "url_starting" quando não há relacionamento na tabela?
Existem milhares de tweets comprometidos com o banco de dados simultaneamente. Não importa se configurado corretamente, não é?