【问题标题】:oracle: release lock on a single row (while retaining locks on other rows)?oracle:释放单行上的锁(同时保留其他行上的锁)?
【发布时间】:2013-06-14 00:12:36
【问题描述】:

使用 Oracle 是否可以(使用单个数据库连接):

  1. 锁定单行 (row1)
  2. 然后锁定另一行 (row2)
  3. 释放 row1 上的锁(保留 row2 上的锁)
  4. 在另一行 (row3) 上获得锁
  5. 释放 row2 上的锁(保留 row3 上的锁)
  6. 释放对 row3 的锁定

我意识到 Oracle 支持多种不同类型的锁(我发现这很有帮助:http://broadh2o.net/docs/database/oracle/oracleLocks.html),所以答案可能取决于选择哪种锁。我对独占锁感兴趣 - 即阻止其他连接更新行的锁。

我想知道我是否可以使用单个数据库连接执行操作 1-6。我当然可以为每一行使用单独的数据库连接。似乎锁是使用 COMMIT/ROLLBACK 释放的,因此这表明释放单行上的锁是不可能的。

【问题讨论】:

    标签: oracle rowlocking


    【解决方案1】:

    您不能选择性地释放行上的锁。锁定 row1 后,该锁定将仅在事务结束时释放。但是你的事务结束也会释放你的事务持有的任何其他锁(即row2上的锁)。

    根据您要解决的业务问题,您可能并不想锁定单个行。您可能希望使用dbms_lock package 来获取和释放一些用户定义的锁。如果您有用户定义的锁lock1lock2lock3,那么您可以像在单个事务中概述的那样获取和释放这三个锁。然而,设置用户定义的锁定可能非常危险,因为它需要开发人员做更多的工作,他们必须使用适当的锁来保护其代码的正确部分,并且因为可以请求一个用户定义的锁当事务提交或回滚时不会被释放,如果你没有正确处理你的异常,这使得你有可能真的把自己踢到脚上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多