【发布时间】:2023-03-16 15:50:01
【问题描述】:
我有以下功能,被多个进程同时使用。但有时在插入操作中会出现重复错误。我以为是锁的问题,所以我改成了 ACCESS EXCLUSIVE 锁,但是不好,因为它锁定了整个表。使用 SHARE ROW EXCLUSIVE 模式似乎可以正常工作,但我对性能和访问权限有些怀疑。其他进程就能访问该表吗?这个锁比前一个锁慢(ROW EXCLUSIVE)?
CREATE OR REPLACE FUNCTION insert_id(...) AS $$
BEGIN
LOCK table IN ROW EXCLUSIVE MODE;
-- select next available id
SELECT
max(id) + 1
INTO
o_id
FROM
table
WHERE
id = i_id;
-- insert id
INSERT INTO
table
(id)
VALUES
(o_id);
END;
$$ LANGUAGE plpgsql;
【问题讨论】:
-
"max(id)+1 ... where id=i_id" 没有意义。 i_id 来自哪里?它与 o_id=i_id+1 有何不同?
-
您好@jjanes,我删除了部分代码以在此处发布。我要说明的是,我正在查询一个表以获取下一个可用的 id(第一个选择)并将这个值插入同一个表中。我知道那样做没有多大意义。但我需要避免的是表中的并发插入。
标签: postgresql locking