我有以下功能,同时由多个进程使用。但是我有时在插入操作中遇到重复错误。我认为这是一个锁的问题,所以我改为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;
答案 0 :(得分:2)
所有锁都是相同的“速度”。重要的是他们阻止了什么。
在这种情况下,您需要的是EXCLUSIVE
锁。这会阻止并发插入/更新/删除,但不会阻止SELECT
。
就个人而言,我完全废除了这个想法。不要尝试在数据库中实现无间隙序列。而是在使用row_number()
窗口函数查询时按需生成它们。