2011-10-20 45 views
0

我在Sybase中使用以下代碼中的過程。在更新Sybase中的表期間解決協調問題

begin transaction get_virtual_acc 

    UPDATE store_virtual_acc SET isProc = 1, Uid = @uid, DateReserv = getdate() 
    from store_virtual_acc (index idx_id) WHERE id = (SELECT min(id) FROM store_virtual_acc (index idx_uid) where Uid = null and isProc = null) 

commit transaction get_virtual_acc 

的問題是,當所述程序被稱爲多用戶concurently他們可以接收相同的分鐘(ID)和與不同的值@uid表更新同一行。結果是數據失真。有必要得到一個結果,如果該行已經選擇更新一個用戶,另一個用戶不能選擇它。表具有鎖定類型的數據行。

試圖用事務級鎖定如下 組事務隔離級別3 交易開始之前,但aplication至極調用的程序獲得異常 值java.sql.SQLException:您的服務器命令(族ID#0,過程ID#530)遇到了死鎖情況。請重新運行您的命令。

我將不勝感激任何幫助。

回答

1

嘗試這樣:

begin transaction get_virtual_acc 

UPDATE store_virtual_acc SET isProc = 1, Uid = @uid, DateReserv = getdate() 
from store_virtual_acc (index idx_id) WHERE id = (SELECT min(id) FROM store_virtual_acc (index idx_uid) holdlock where Uid = null and isProc = null) 

commit transaction get_virtual_acc 

的關鍵詞是HOLDLOCK