交易&锁定问题

时间:2010-06-11 11:48:41

标签: progress-4gl progress-db

使用in do事务,我定义了一个标签,在这个标签中我正在访问一个带有exclusive-lock的表。在标签的末尾,我已经完成了该表中的所有更改。 bt现在我在事务块中。 现在,我试图在另一个会话中访问同一个表。然后它显示一个错误,表由另一个用户使用。因此,我们可以在事务中释放teh表,以便其他用户可以访问它。

例如:

第1节)

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

第2节)

我尝试访问同一个表,但它显示错误,该表已被其他用户锁定。

2 个答案:

答案 0 :(得分:4)

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

应该注意的是,如果你真的不需要在第二个进程中锁定这些记录,只需要查看它们的更新值,那就可以了。一旦更新的记录不再在记录缓冲区中(或者记录锁定状态降级为NO-LOCK中的TRANSACTION),它们将变为边缘锁定,您可以使用{查看其更新的值{1}}。要使循环中的最后一条记录成为一个限制锁定,您可以执行此操作

NO-LOCK

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

FIND CURRENT tablerecord NO-LOCK.

答案 1 :(得分:3)