【问题标题】:"SHARE ROW EXCLUSIVE" mode lock in PostgresPostgres 中的“SHARE ROW EXCLUSIVE”模式锁定
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-09-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 1970-01-01
    相关资源
    最近更新 更多