解决oracle分布式锁,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;

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

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

标签:oracle12c,oracle,plsql,distributed-computing,c

来源: https://codeday.me/bug/20191025/1925331.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值