首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用Oracle PL/SQL同时持有两个锁吗?

我可以使用Oracle PL/SQL同时持有两个锁吗?
EN

Stack Overflow用户
提问于 2012-07-27 20:50:36
回答 1查看 751关注 0票数 2

我的应用程序当前的锁概念假设获得2个锁并执行代码。但我总是得到一个错误,当我试图释放第一个锁把手。有没有办法做到这一点,或者我使用dbms_lock一次获得两个锁是错误的吗?

诚挚的问候!

代码语言:javascript
复制
DECLARE
  l_handle_1 VARCHAR2(128);
  l_handle_2 VARCHAR2(128);
  l_result NUMBER;
BEGIN

    -- >>> LOCK1
    dbms_lock.allocate_unique('lock_1', l_handle_1);
    l_result := dbms_lock.request(l_handle_1, dbms_lock.x_mode, 10, true);
    BEGIN

      -- >>> LOCK2
      dbms_lock.allocate_unique('lock_2', l_handle_2);
      l_result := dbms_lock.request(l_handle_2, dbms_lock.x_mode, 10, true);
      BEGIN

        /*
         * PLSQL-Code with both locks held
         */

        -- LOCK-2 release
        l_result := dbms_lock.release(l_handle_2);
        IF (l_result > 0) THEN
          dbms_output.put_line('Fail 2');
        END IF;

        -- LOCK-1 release
        l_result := dbms_lock.release(l_handle_1);
        IF (l_result > 0) THEN
          dbms_output.put_line('Fail 1');
        END IF;

      EXCEPTION
        WHEN OTHERS THEN
          l_result := dbms_lock.release(l_handle_2);
          IF (l_result > 0) THEN
            dbms_output.put_line('Fail 3');
          END IF;
          RAISE;          
      END;

    EXCEPTION
      WHEN OTHERS THEN
        l_result := dbms_lock.release(l_handle_1);
        IF (l_result > 0) THEN
          dbms_output.put_line('Fail 4');
        END IF;
        RAISE;
    END;
END;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-27 22:13:00

对于第一个锁句柄,使用release_on_commit = TRUE调用dbms_lock.request,然后调用allocate_unique。allocate_unique执行commit,因此释放第一个锁。

如果您按如下方式更改代码,则不会出现错误:

代码语言:javascript
复制
DECLARE
  l_handle_1 VARCHAR2(128);
  l_handle_2 VARCHAR2(128);
  l_result NUMBER;
BEGIN


    dbms_lock.allocate_unique('lock_1', l_handle_1);
    dbms_lock.allocate_unique('lock_2', l_handle_2);

    -- >>> LOCK1
    l_result := dbms_lock.request(l_handle_1, dbms_lock.x_mode, 10, true);
    BEGIN

      -- >>> LOCK2
      -- dbms_lock.allocate_unique('lock_2', l_handle_2);
      l_result := dbms_lock.request(l_handle_2, dbms_lock.x_mode, 10, true);
      BEGIN

        /*
         * PLSQL-Code with both locks held
         */

        -- LOCK-2 release
        l_result := dbms_lock.release(l_handle_2);
        IF (l_result > 0) THEN
          dbms_output.put_line('Fail 2');
        END IF;

        -- LOCK-1 release
        l_result := dbms_lock.release(l_handle_1);
        IF (l_result > 0) THEN
          dbms_output.put_line('Fail 1');
        END IF;

      EXCEPTION
        WHEN OTHERS THEN
          l_result := dbms_lock.release(l_handle_2);
          IF (l_result > 0) THEN
            dbms_output.put_line('Fail 3');
          END IF;
          RAISE;          
      END;

    EXCEPTION
      WHEN OTHERS THEN
        l_result := dbms_lock.release(l_handle_1);
        IF (l_result > 0) THEN
          dbms_output.put_line('Fail 4');
        END IF;
        RAISE;
    END;
END;
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11688127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档