oracle:释放单行锁(同时保留其他行的锁)?

时间:2013-06-13 15:58:58

标签: oracle rowlocking

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

  1. 锁定单行(row1)
  2. 然后锁定另一行(第2行)
  3. 释放第1行的锁定(保留第2行的锁定)
  4. 获取另一行(第3行)的锁定
  5. 释放第2行的锁定(保留第3行的锁定)
  6. 释放第3行的锁定
  7. 我意识到Oracle支持许多不同类型的锁(我发现这非常有用:http://broadh2o.net/docs/database/oracle/oracleLocks.html),所以答案可能取决于选择哪种锁。我对独占锁感兴趣 - 即阻止其他连接更新行的锁。

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

1 个答案:

答案 0 :(得分:2)

您无法有选择地释放行上的锁定。锁定row1后,该锁定仅在事务结束时释放。但是,事务结束时还会释放事务所持有的任何其他锁(即第2行的锁)。

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