2014-10-01 27 views
1

我想問一下是否有方法在消息框中顯示緩衝區的當前鎖定類型。有沒有辦法做到這一點?進度4GL顯示緩衝區鎖定類型

我只想檢查我的緩衝區在運行時有什麼類型的鎖。

例如:MESSAGE STRING(myBuffer:LOCK-TYPE).
輸出:NO-LOCK/SHARE-LOCK/EXCLUSIVE-LOCK

回答

1
直接

不。

您可以使用LOCKED(bufferName)函數(或緩衝區句柄對象的相關屬性)來查看它是否被鎖定,但不能以這種方式區分SHARE和EXCLUSIVE。

真的那應該夠了 - 如果它沒有鎖定,那麼你不會給其他人造成任何問題。如果它被鎖定,無論是共享的還是獨佔的,那麼沒有其他人可以鎖定它。如果您最初要求購買EXCLUSIVE-LOCK,那麼您可以享受它。如果您未能指定鎖定類型,或者您明確說過SHARE-LOCK並且現在想要升級鎖定,則應使用FIND CURRENT表格EXCLUSIVE-LOCK。如果你得到升級,你有一個獨佔鎖。如果不是那麼它是NO-LOCK或SHARE-LOCK(你可以從你之前的測試中知道)。

從理論上講,你也許可以在其中掃描_LOCK VST和分析信息,但是這是一個簡單的函數長的路,可能滿足詞「只是」陳述的要求:)

這是也非常危險 - _LOCK VST是不穩定的(條目進出速度比它們可讀的速度快),編寫代碼似乎很容易開發,但在生產環境中嚼碎了大量的CPU時間。不要嘗試它。它不會結束。

如果硬要無視我從像這樣創建快照至少工作:

define variable i as integer no-undo. 

define temp-table tt_lock no-undo like _lock 
    index id-idx is unique primary _lock-id 
    index recid-idx _lock-recid 
    index usr-idx _lock-usr 
    index tbl-idx _lock-table 
. 

empty temp-table tt_lock. 

for each _lock while _lock._lock-usr <> ?: 

    i = i + 1. 
    if i > 10000 then leave. 

    create tt_lock. 
    buffer-copy _lock to tt_lock no-error. 

end. 

注意在使用WHILE爲每個。如果你不理我並嘗試這種方法,我勸你試驗一下。你會發現WHILE比WHERE標準可能做得更快。

「if i> 10000 then leave。」是州長。你應該在任何涉及_LOCK的代碼中有類似的東西。它可以防止它在具有大型鎖定表的PROD系統上意外發生瘋狂。

不管你有多想你想這樣做,你都犯了一個錯誤。請不要去那裏。如果您想了解這些問題,或者您正在開發環境中查看問題,請進行實驗,但請勿將此類代碼投入生產。

+0

來自文檔:如果某個記錄不適用於先前的FIND,則LOCKED()將返回一個TRUE值。 。 。 NO-WAIT語句,因爲*另一個用戶*已鎖定記錄。例如,我嘗試了以下代碼在一個sports2000分貝,並得到「不」作爲迴應。找到第一位客戶獨佔鎖。鎖定消息(客戶)視圖 - 作爲警報框。 這意味着它不能用作通用檢查來查看當前程序或會話是否將記錄鎖定在某處。它可以在FIND EXCLUSIVE-LOCK NO-WAIT後使用。看看是否有效。 – 2014-10-03 21:15:24

+0

如果有人把它鎖了,你不要。如果沒有人可以...... – 2014-10-03 23:47:27