使用in do事务,我定义了一个标签,在这个标签中我正在访问一个带有exclusive-lock的表。在标签的末尾,我已经完成了该表中的所有更改。 bt现在我在事务块中。 现在,我试图在另一个会话中访问同一个表。然后它显示一个错误,表由另一个用户使用。因此,我们可以在事务中释放teh表,以便其他用户可以访问它。
例如:
第1节)
DO TRANSACTION:
---
---
loopb:
REPEAT:
--
--
---------------------> control is here right now.
END. /*repeat*/
--
--
END. /*do transaction*/
第2节)
我尝试访问同一个表,但它显示错误,该表已被其他用户锁定。
答案 0 :(得分:4)
在EXCLUSIVE-LOCK
完成之前,您使用TRANSACTION
在循环中触摸的所有记录都无法被其他用户锁定。没有绕过这个。如果第二个进程需要锁定这些记录,那么您所能做的就是在第一个进程中减少TRANSACTION
范围。这是一项安全功能,因此如果稍后在TRANSACTION
,所有中发生错误,则会回滚TRANSACTION
期间所做的更改。另一种看待它的方法是,如果你可以在TRANSACTION
期间释放一些记录锁定,你将失去作为TRANSACTION
定义一部分的原子性(全有或全无)。
应该注意的是,如果你真的不需要在第二个进程中锁定这些记录,只需要查看它们的更新值,那就可以了。一旦更新的记录不再在记录缓冲区中(或者记录锁定状态降级为NO-LOCK
中的TRANSACTION
),它们将变为边缘锁定,您可以使用{查看其更新的值{1}}。要使循环中的最后一条记录成为一个限制锁定,您可以执行此操作
NO-LOCK
或者,如果您不再需要访问记录缓冲区:
FIND CURRENT tablerecord NO-LOCK.
答案 1 :(得分:3)