Postgres中的“SHARE ROW EXCLUSIVE”模式锁定

时间:2014-01-22 18:13:16

标签: postgresql locking

我有以下功能,同时由多个进程使用。但是我有时在插入操作中遇到重复错误。我认为这是一个锁的问题,所以我改为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;

1 个答案:

答案 0 :(得分:2)

所有锁都是相同的“速度”。重要的是他们阻止了什么。

在这种情况下,您需要的是EXCLUSIVE锁。这会阻止并发插入/更新/删除,但不会阻止SELECT

就个人而言,我完全废除了这个想法。不要尝试在数据库中实现无间隙序列。而是在使用row_number()窗口函数查询时按需生成它们。