这个互斥实现在 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 操作。
如果应用程序想要使用数据库技术进行同步,这是一个完美的工具。
我需要在 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 操作。
如果应用程序想要使用数据库技术进行同步,这是一个完美的工具。