这个互斥实现在 PostgreSQL 中有意义吗?

Would this mutex implementation make sense in PostgreSQL?

我需要在 Postgre 中实现数据库会话之间的同步SQL。

在 SQL 服务器中,我将通过创建自己的 "locking" table.

来实现它
Create table MyLock(LockName VARCHAR(100) NOT NULL UNIQUE, LockOwner INT NULL)

我不使用显式事务来避免真正锁定,我会通过将我的会话 ID 设置为 "owner".

来获取我的 "singleton" 锁
UPDATE MyLock
  SET LockOwner = *MySessionId*
  WHERE LockName = 'Singleton' 
  AND LockOwner IS NULL;

通过不使用显式事务,我没有阻碍其他进程。 您可以将其视为 "soft lock"...

如果我的更新成功,那么我就知道我 "have" 锁定了,我可以处理一些代码,而其他人会等待。 如果我的更新什么也没更新,我知道其他人有 "lock" 我会等待,或者放弃。

我需要在 Postgre 中实现类似的东西SQL。

你会这样做吗?

不,我会做不同的事情。

问题是您需要不断轮询锁,这意味着不必要地浪费了 CPU 时间或不必要的等待时间。

这个要求非常适合 PostgreSQL 的 advisory locks:

您可以选择一个锁号,而不是像 Singleton 这样的锁名,例如1234.

获取锁,运行

SELECT pg_advisory_lock(1234);

解除锁定,运行

SELECT pg_advisory_unlock(1234);

这就像普通的数据库锁一样工作,如果锁不可用则暂停调用进程,并在锁持有者释放锁后立即恢复调用进程。还有一些功能可以在不阻塞的情况下“轮询”建议锁的可用性。

这些锁独立于 PostgreSQL 的事务,它们一直保持到释放或数据库会话结束(因此不存在“孤立锁”的危险)。

这些锁也不会干扰 autovacuum 操作。

如果应用程序想要使用数据库技术进行同步,这是一个完美的工具。