0

在做事务中,我定义了一个标签,在这个标签中我正在使用排他锁访问一个表。在标签的末尾,我已经完成了该表中的所有更改。bt 现在我在事务块中。现在,我试图在另一个会话中访问同一个表。然后它显示一个错误,另一个用户使用的表。那么有没有可能,我们可以在事务中释放表,以便其他用户可以访问它。

例如:

会议 1)

DO TRANSACTION:
  ---
  ---
  loopb:
  REPEAT:
    --
    --
    ---------------------> control is here right now.
  END. /*repeat*/
  -- 
  --
END. /*do transaction*/

会议 2)

我试图访问同一张表,但它显示错误,该表被另一个用户锁定。

4

2 回答 2

4

在完成之前,您在循环中使用的所有这些记录EXCLUSIVE-LOCK都不能被其他用户锁定TRANSACTION。没有办法解决这个问题。如果第二个过程需要锁定这些记录,那么您所能做的就是缩小TRANSACTION第一个过程的范围。这是一项安全功能,因此如果稍后在 中发生错误,则在 中TRANSACTION所做的所有更改TRANSACTION都将回滚。另一种看待它的方式是,如果您可以在 a 期间释放一些记录锁TRANSACTION,您将失去作为 a 定义的一部分的原子性(全有或全无)TRANSACTION

需要注意的是,如果你真的不需要在第二个过程中锁定这些记录,而只需要查看它们的更新值,那是可能的。一旦更新的记录不再在记录缓冲区中(或记录锁定状态降级为NO-LOCK中的a TRANSACTION),它们将成为边缘锁,您可以使用 a 查看它们的更新值NO-LOCK。要使循环中的最后一条记录成为边缘锁,您可以这样做

FIND CURRENT tablerecord NO-LOCK.

或者,如果您不再需要访问记录缓冲区:

RELEASE tablerecord.
于 2010-06-11T14:54:31.017 回答
3

其他会话可以使用 NO-LOCK 对记录进行“脏读”。但是在事务提交(或回滚)之前,他们将无法锁定或更新它。在重复块迭代或您离开它之前,这不会发生。

于 2010-07-25T14:49:07.853 回答