实施 active/passive 集群:如何将 Oracle 用于我的分布式锁?

Implementing active/passive cluster: how to use Oracle for my distributed lock?

我正在尝试实施 active/passive 服务器集群。我在使用 SQL 服务器的 sp_getapplock.

之前做过这种事情

我可以求助于 Oracle 的 DBMS_LOCK,但出于各种(愚蠢的 IMO)原因,DBA 不会授予执行此操作的权限。

我尝试从我的 C# 中执行 SQL LOCK TABLE x IN EXCLUSIVE MODE,然后在事务中执行 Thread.Sleep();当该服务器执行相同的代码时,这不会阻止另一台服务器。我已经预料到它会这样做了。

我是否需要执行其他操作,或者是否有其他方法以阻塞方式使用 Oracle 来锁定我的应用程序?

我知道我可以循环读取锁定值以寻找更改,但我不想通过轮询模拟锁定。

如果您的客户直到最后才需要承诺,这应该很容易。

创建一个包含一列和一条记录的 table。例如,

CREATE TABLE my_lock ( dummy varchar2(1) );
INSERT INTO my_lock VALUES ( 'X' );
COMMIT;

让每个事务在尝试开始之前都执行此操作:

SELECT * FROM my_lock FOR UPDATE NOWAIT;

如果成功,执行交易。如果失败,请等待并重试(或引发错误或任何你想要的)。

如果您不想在客户端中循环,您可以改为:

SELECT * FROM my_lock FOR UPDATE;

这将导致潜在的事务暂停,直到他们获得开始所需的独占锁,而不是给他们一个错误。

有很多方法可以让它变得更有趣、更强大,但这是基本的想法。