2017-03-01 53 views
1

我使用的是OpenEdge版本11.1。我在運行時我偶爾會收到以下錯誤信息:10秒OpenEdge記錄鎖調試

鎖等待超時過期(8812)

根據我的調試日誌,錯誤在不同類別中發生,這使得它變得非常難以調試。有沒有什麼辦法可以打印到調試日誌的一些有關錯誤的細節,比如哪個記錄被鎖定?

回答

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-WAITFIND聲明:

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

然後,您可以在IF-THEN語句添加您的調試代碼。

+0

問題是,錯誤發生不可預知的。有沒有辦法讓這個代碼在發生錯誤時執行? – user1982125

+0

在你的FIND上使用'NO-WAIT',然後檢查'LOCKED()'。我已經添加到我的答案。 – TheDrooper

0

它總是取決於上下文,但10秒非常短!我已經習慣1800秒了。這是您可以更改的數據庫啓動系統參數。

這是一個擁有數千用戶的大公司。從來沒有找到完全控制鎖定問題的非常好的方法,但是我所做的是將一些邏輯添加到監控一堆24/24東西的Unix腳本中。

我實現的目標是在實際發生鎖定超時之前至少將警報發送到我們的服務檯。

使用_lock,_file(table)和_user你可以有關於鎖定用戶的非常詳細的信息,什麼表和什麼記錄。

我們的情況可能不同,但我們不關心1個用戶鎖定記錄10分鐘......但我們想要追捕鎖定另一個用戶等待的記錄的用戶。因爲當發生鎖定超時時,它還會撤消依賴於上下文的事務,這可能會造成麻煩!

所以我們記下一個鎖,如果它不超過10分鐘,我們會觸發警報,發送我們所能做的一切。包括其他用戶爲同一個記錄「打架」。更常見的問題不是那些正在更新關鍵表並由於某種原因而使屏幕打開的用戶。