CodeGo.net>实现主动/被动集群:如何使用Oracle的分布式锁?

我正在尝试实现服务器的主动/被动群集.在使用SQL Server的sp_getapplock之前,我已经做了这种事情.

我可以谈一下Oracle的DBMS_LOCK,但是由于各种(愚蠢的IMO)原因,DBA不会授予访问权限来执行此操作.

我试图诉诸于在我的C#中以独占模式执行SQL LOCK TABLE X,然后在事务内部执行Thread.Sleep().当该服务器执行相同的代码时,这不会阻止该服务器.我曾期望这样做.

我是否需要做其他事情,或者是否有另一种方法可以以阻塞方式使用Oracle来锁定应用程序?

我知道我可以循环读取锁值以查找更改,但是我宁愿不使用轮询来模拟锁.

解决方法:

如果您的客户直到最后都不需要提交,这应该很容易.

创建一个包含一列和一条记录的表.例如.,

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;

这将导致可能的事务暂停,直到它们可以获取需要开始的排他锁为止,而不是给它们带来错误.

有很多方法可以使它变得更加有趣和强大,但这是基本思想.

上一篇:PLSQL图形界面设置oracle的JOBS


下一篇:PLSQL基本语法