OpenEdge记录锁定调试

问题描述 投票:1回答:2

我使用的是OpenEdge 11.1版。我偶尔会在运行时收到以下错误消息:

锁定等待超时10秒到期(8812)

根据我的调试日志,错误发生在各种类中,这使得调试异常困难。有什么方法可以打印到调试日志中有关错误的一些细节,例如哪个记录被锁定了?

openedge progress-4gl progress-db
2个回答
1
投票

这通常意味着您正在尝试锁定已锁定的记录。 OpenEdge等待10秒(或-lkwtmo启动参数指定的时间)然后放弃,将错误留在日志中。

要找出锁定的记录,请查看_Lock表。这是一张隐藏的桌子;您可以通过进入数据字典并选择查看 - 显示隐藏表来查看其架构。 _Lock记录包含诸如记录ID,锁定类型(共享/独占),锁定用户的信息等信息。您可以使用此代码将锁定表转储到文件中。希望它能帮助您追踪锁定的记录。

OUTPUT TO VALUE("locktable.txt").

FOR EACH _Lock WHERE _Lock._Lock-RecID <> ? NO-LOCK: 
    FIND _File WHERE _File._File-Number = _Lock._Lock-Table NO-LOCK NO-ERROR.
    PUT UNFORMATTED
        _Lock._Lock-Name " "
        _Lock._Lock-Usr " "
        _File._File-Name " "
        _Lock._Lock-RecID " "
        _Lock._Lock-Type " "
        _Lock._Lock-Flags
        SKIP.
END.

OUTPUT CLOSE.

要捕获锁定错误,请在NO-WAIT语句中添加FIND

FIND FIRST <TableName> WHERE ... EXCLUSIVE-LOCK NO-WAIT NO-ERROR.
IF LOCKED(<TableName>) THEN ...

然后,您可以在IF-THEN语句中添加调试代码。


0
投票

它总是取决于上下文,但10秒非常短!我习惯了1800秒嘿。这是您可以更改的数据库启动系统参数。

这是一家拥有数千名用户的大公司。从来没有找到一种完全控制锁定问题的好方法,但我所做的是在Unix脚本中添加一些逻辑来监视一堆24/24的东西。

我实现的是在锁定超时实际发生之前至少发送一个警报发送到我们的服务台。

使用锁,文件(表)和用户,您可以获得关于锁定的用户,什么表和什么记录的非常详细的信息。

我们的情况可能有所不同,但我们并不关心1个用户锁定记录10分钟...但我们想要找一个用户锁定另一个用户等待的记录。因为当锁定超时发生时它也会撤消事务,这取决于上下文可能会有麻烦!

所以我们记下一个锁,如果它不移动超过10分钟,我们会触发警报,发送我们可以做的一切。包括其他用户为同一记录“打架”。更常见的是,问题是用户正在更新关键表并由于某种原因使屏幕保持打开状态。

© www.soinside.com 2019 - 2024. All rights reserved.