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

Eri*_*met 4 postgresql synchronization mutex

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

在 SQL Server 中,我将通过创建自己的“锁定”表来实现它。

Create table MyLock(LockName VARCHAR(100) NOT NULL UNIQUE, LockOwner INT NULL)
Run Code Online (Sandbox Code Playgroud)

我不使用显式事务来避免真正锁定事物,我将通过将会话 ID 设为“所有者”来获取“单例”锁。

UPDATE MyLock
  SET LockOwner = *MySessionId*
  WHERE LockName = 'Singleton' 
  AND LockOwner IS NULL;
Run Code Online (Sandbox Code Playgroud)

通过不使用显式事务,我不会阻止其他进程。您可以将其视为“软锁”...

如果我的更新成功,那么我知道我“拥有”锁,我可以处理一些代码,而其他人会等待。如果我的更新没有更新,我知道其他人有“锁”,我等待,或者放弃。

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

你会这样做吗?

Lau*_*lbe 9

不,我会以不同的方式去做。

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

这个要求非常适合 PostgreSQL 的建议锁

而不是像Singleton您选择锁号的锁名称,例如 1234。

要获取锁,请运行

SELECT pg_advisory_lock(1234);
Run Code Online (Sandbox Code Playgroud)

要释放锁定,请运行

SELECT pg_advisory_unlock(1234);
Run Code Online (Sandbox Code Playgroud)

这就像普通的数据库锁一样,通过在锁不可用时挂起调用进程并在锁持有者释放锁后立即恢复它。还有一些功能可以在不阻塞的情况下“轮询”一个咨询锁的可用性。

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

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

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

  • 是的,它们与会话相关联。 (3认同)
  • 如果“客户端”软件执行某种连接池,如果我们不明确释放它们,我们是否有无意中传递会话咨询锁的潜在风险? (2认同)