[英]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.