我正在尝试实现服务器的主动/被动群集.在使用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;
这将导致可能的事务暂停,直到它们可以获取需要开始的排他锁为止,而不是给它们带来错误.
有很多方法可以使它变得更加有趣和强大,但这是基本思想.