gpt4 book ai didi

java - PostgreSQL-错误 : tuple concurrently updated

转载 作者:行者123 更新时间:2023-11-29 13:04:14 26 4
gpt4 key购买 nike

以下查询由两个不同用户登录的两个线程同时执行:

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;

有时,我会收到以下错误:

tuple concurrently updated

我不知道是什么引发了这个错误,也不知道为什么会引发这个错误。你能点一盏灯吗?


这里是表 mystat 的 sql 定义。

mystats.sql

CREATE TABLE mystat
(
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
);

最佳答案

这并不是真正的答案 - 更像是帮助其他偶然发现此错误的人。

在我的例子中,我试图花哨并将我所有函数的创建封装在一个函数中。

有点像

CREATE OR REPLACE FUNCTION main_func()
BEGIN

CREATE OR REPLACE FUNCTION child_func1()
BEGIN
END

CREATE OR REPLACE FUNCTION child_func1()
BEGIN
END

main func stuff...
END

无论出于何种原因,我都可以从 pgAdmin 内部毫无问题地调用此函数。我可以根据需要从 Java -> MyBatis 调用它。

但是,一旦我开始从两个不同的线程调用该函数,我就从 OP 收到错误:错误:元组同时更新

解决方法是,简单地将这些子函数从主函数中取出,并单独维护它们。

回顾过去,通过调用函数来创建函数是一个非常糟糕的主意。但是,我们的想法是将所有功能“封装”在一起。

希望这对某人有帮助。

关于java - PostgreSQL-错误 : tuple concurrently updated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19382284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com