代码之家  ›  专栏  ›  技术社区  ›  Kit

实现主动/被动集群:如何使用Oracle实现分布式锁?

  •  3
  • Kit  · 技术社区  · 6 年前

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

    我可以求助于甲骨文 DBMS_LOCK ,但由于各种原因(dumb IMO),dba不会授予访问权限。

    我试着执行SQL LOCK TABLE x IN EXCLUSIVE MODE 从我的C#后面跟着 Thread.Sleep()

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

    1 回复  |  直到 6 年前
        1
  •  4
  •   Matthew McPeak    6 年前

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

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

    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;
    

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