0

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

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

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

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

4

1 回答 1

2

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

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

于 2013-06-13T16:12:36.770 回答