[英]Progress ABL, How to determine which end-user is locking a record and display to other end-users who is locking the record?
我意识到Progress ABL有这样做的自然倾向:
默认情况下,“进度”显示消息:正在使用。 等待或选择取消停止。 (2624)
该2624消息提供了信息,但通常不是所希望的,因为用户没有机会没有STOP条件就无法提交更改或继续操作。 然后将它们返回到启动过程。
但是,我希望能够在______锁定之后执行以下操作,以显示哪个正在锁定记录:显示和特定记录已锁定
我确实在这篇文章底部的文章中找到了有关使用VST _Lock的信息,但是Progress文档指出了以下逐字记录:“注意:谨慎地查询_Lock表;频繁的访问会消耗大量的系统资源,并对性能产生负面影响。 ” 是否有替代方法或最佳实践? 任何帮助将不胜感激。
我很想向用户提供有关谁握着锁的好消息的愿望。 但是kbase并不是在开玩笑。 以这种方式使用_LOCK是一个非常糟糕的主意。
11.4+可以减少它的坏处,但是在大型生产系统上仍然是一件非常痛苦的事情。
在具有默认锁定表大小(-L 8192)的小型系统上,它似乎“确定”。 在具有大锁表的大型活动系统上(1 L到-L的值很常见)并且使用了大量锁,您将获得非常非常不同且负面的体验。
更好的解决方案可能是查看“阻止的用户”:
for each dictdb._Connect no-lock
where _Connect-usr <> ?
and _Connect-wait <> " -- ": /* there are spaces around the '--' */
display _Connect.
end.
这样会更快,并且可能会告诉您所有您需要了解的内容。
如果无论kbase的警告如何,都将扫描_LOCK,则至少在循环中放入一些逻辑以跟踪它花费了多长时间,并且如果它太长了则请保释。 这样的事情可能是一个好的开始:
etime( yes ).
for each dictdb._Lock where _Lock._Lock-usr <> ? and _Lock._Lock-recid <> ?:
if etime > 500 then leave.
/* whatever ... */
end.
我假设您已经熟悉find ... Exclusive-lock / share-lock no-wait no-error,因为如果不使用no-wait,就无法使用锁定功能。
查询_lock可能还不错,因为注释听起来很合理。 仅当用户遇到锁定冲突时,才偶尔执行此操作。 此外,性能很大程度上取决于当前锁定的条目总数。
重要的是,根据Progress版本,以正确的方式查询_lock。
重复我对类似问题的回答 :
在11.4之前的版本中,未对字段进行索引,但是所有使用的锁都位于表的开头,因此您可以使用
FOR EACH _Lock NO-LOCK: IF _Lock._Lock-Usr = ? THEN LEAVE.
(_Lock._Lock-Name =?也可以)。 请参阅http://knowledgebase.progress.com/articles/Article/P161995 (显然,对于很大的锁表或许多锁,实际上并非如此。这可能是您最好的选择,因为扫描整个锁表确实需要一段时间。)
在11.4和11.5中,填充的条目不再位于开头,因此旧代码将给出错误的结果(请参见http://knowledgebase.progress.com/articles/Article/000056304 ,该问题已在11.5.1中修复)。 幸运的是,现在扫描锁定表的速度要快得多,因此您可以使用
FOR EACH _Lock NO-LOCK WHERE _Lock-Recid <> ?:
在同一篇文章中提到。 从技术上讲,这不是通过索引实现的。 (索引不适用于<>运算符。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.