当前位置: 首页 > 知识库问答 >
问题:

Postgres 中的“共享行独占”模式锁定

羊舌高明
2023-03-14

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

公孙宏畅
2023-03-14

所有的锁都是一样的“速度”。重要的是他们还屏蔽了什么。

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

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

 类似资料:
  • 我在Linux上,我想在大约5-10个进程之间共享内存(每个进程是一个C程序)。我知道如何使用POSIX信号量(sem_open、sem_wait、sem_post等)或其他信号量(semctl、semget、semop等)来实现这一点。问题是我只知道如何做独占信号量锁。我想要非专属锁。 在我的应用程序中,只有一个进程写入共享内存,而所有其他进程只读取它。我希望能够对信号量进行非独占读锁(就像sh

  • 我在第一个事务中运行以下查询: 然后是第二个,来自不同的连接,这是完全相同的。在,它正在等待。 然后我运行下面的代码来查看锁 它显示行锁(ROW SHARE,ROW EXCLUSVE),这很好。但我也看到了 根据文档来自: 通过ALTERTABLE、DROP TABLE、TRUNCATE、REINDEX、CLUSTER和VACUUM FULL命令获取。这也是未显式指定模式的lock TABLE语句

  • 如何获得整个Postgres表的锁,这样就没有其他进程可以更新表中的任何行(但仍然可以使用SELECT读取行)?我认为我想要的锁类型是EXCLUSIVE,但我不确定如何使用ecto查询为整个表获取这样的锁。 谢谢

  • 主要内容:1 acquireShared共享式获取锁,1.1 tryAcquireShared尝试获取共享锁,1.2 doAcquireShared自旋获取共享锁,2 reaseShared共享式释放锁,3 acquireSharedInterruptibly共享式可中断获取锁,3.1 doAcquireSharedInterruptibly共享式可中断获取锁,4 tryAcquireSharedNanos共享式超时获取锁,,,,,,详细介绍了AQS中的同步状态的共享式获取、释放的原理,以及独占

  • 在分布式Java桌面应用程序通过JDBC访问的特别请求的DB2表中,我每天都会多次收到以下场景: > 客户机A想要插入新的寄存器,并在表上获得一个IX锁,X锁在每个新行中; 其他客户端想要执行SELECT,被授予表上的IS锁,但应用程序卡住了; 客户机A继续工作,但是插入和更新查询没有被提交,锁没有被释放,并且它继续收集X个锁到每一行; 客户端 A 退出,其工作未提交。其他客户端最终获取其 SEL

  • 问题内容: 我正在编写一个程序,该程序将协调实时数据库中的最终交易。我正在进行的工作无法作为set操作完成,因此我使用了两个嵌套游标。 我在对每个客户端进行协调时需要对事务表进行排它锁,但是我想释放该锁,并让其他人在我处理的每个客户端之间运行查询。 我想在行级别而不是表级别上执行排他锁,但是到目前为止,我读到的内容说如果其他事务在隔离级别上运行(这对我来说),我将无法执行。 我是否正确获取了表级互