A consulta a seguir é realizada simultaneamente por dois threads logados com dois usuários diferentes:
WITH raw_stat AS (
SELECT
host(client_addr) as client_addr,
pid ,
usename
FROM pg_stat_activity
WHERE usename = current_user
)
INSERT INTO my_stat(id, client_addr, pid, usename)
SELECT nextval('mystat_sequence'), t.client_addr, t.pid, t.usename
FROM (
SELECT client_addr, pid, usename
FROM raw_stat s
WHERE
NOT EXISTS (
SELECT NULL
FROM my_stat u
WHERE current_date = u.creation
AND s.pid = u.pid
AND s.client_addr = u.client_addr
AND s.usename = u.usename
)
) t;
De vez em quando recebo o seguinte erro:
tuple concurrently updated
Não consigo descobrir o que gera esse erro e por que esse erro é gerado. Você pode lançar uma luz?
Aqui está a definição sql da tabela my_stat.
CREATE TABLE my_stat
(
id bigint NOT NULL,
creation date NOT NULL DEFAULT current_date,
client_addr text NOT NULL,
pid integer NOT NULL,
usename name NOT NULL,
CONSTRAINT mystat_pkey PRIMARY KEY (id)
)
WITH (
OIDS=FALSE
);
Eu consigo resolver meu problema alterando minha consulta para esta:
Acho que algo aconteceu sob o capô desde os internos do Postgresql, mas não consigo descobrir o que ...