2016-05-12 126 views
0

我毫不猶豫地承認,我對於sybase的返回代碼一無所知。我的經驗主要與Oracle和SQL Server有關。這個特定的項目需要插入一個表的二進制字段,該表定期失敗,因爲該條目被鎖定。看看代碼,它不會顯示我能夠成功檢測到鎖定條件。我目前的策略是插入數據,然後選擇並確定插入是否成功,如果未使用在重試嘗試之間休眠幾秒鐘的線程,請重試。這無法解釋其他數據,這些數據可能在我原始數據插入之前改變了條目,並且可能比我試圖插入的數據更新。有沒有簡單的方法來確定在嘗試插入之前該行是否被鎖定,等待鎖定清除,然後在插入之前自行鎖定該行?或者,如果我可以檢測到條目已被鎖定,那麼我可以使事務失敗並提醒用戶出現故障,以便可以手動檢查它。在任何人詢問之前,我無法改變RDMS的體系結構來設置鎖定條目。這必須由執行插入的代碼來處理。檢查由於頁面鎖定而導致的插入失敗

+0

'LOCK TABLE <

>以獨佔方式NOWAIT'會嘗試你的桌子上獲得排它鎖。如果檢查失敗,請檢查「@@ error!= 0」 – Meet

回答

0

嘗試:

BEGIN TRANSACTION 

    LOCK TABLE <<table_name>> 
     IN EXCLUSIVE MODE NOWAIT 

    IF @@error != 0 
    BEGIN 
     ROLLBACK TRANSACTION 
     PRINT 'COULD NOT ACQUIRE LOCK. EXITING ...' 
     RETURN 0 
    END 

    << your code here if it was able to lock >> 

COMMIT TRANSACTION 
+0

我對sybase並不感興趣,但似乎有點矯枉過於必須鎖定整個表才能嘗試檢測單個記錄被阻止更新/插入? – Bill

1

鎖定整個表會的工作,但如果你只是尋找一個頁面的小粒度(按你的問題的標題)相當粗糙。 實際上,您可以通過在INSERT之前執行SET LOCK NOWAIT,然後檢查@@ ERROR獲取狀態碼12205,該狀態碼指示爲執行插入操作而需要執行某些操作時鎖定了該狀態碼。不要忘記運行SET LOCK WAIT以恢復默認設置,否則NOWAIT將應用於會話的其餘部分。

+0

不錯,不知道你可以指定它在全球範圍內的一個會議,他們也將使用自己的鎖定機制..好! – Meet

相關問題