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 中实现类似的东西。
你会这样做吗?
不,我会以不同的方式去做。
问题是您需要不断轮询锁,这意味着不必要地浪费了 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 操作。
如果应用程序想要使用数据库技术进行同步,这是一个完美的工具。
| 归档时间: |
|
| 查看次数: |
1903 次 |
| 最近记录: |