我有保存客戶端的連接和斷開時間的表。如何避免簡單更新語句的死鎖?
ID int
ClientID int
BeginDate datetime
EndDate datetime
當客戶端連接,一個Session
記錄與其EndDate
創建爲空。
INSERT Session(ClientID, BeginDate, EndDate)
VALUES(@ClientID, GETDATE(), null)
當客戶端斷開時,我更新會話所以它的EndDate
包含斷開連接的時間。
UPDATE Session
SET EndDate = GETDATE()
WHERE Id = @SessionID
但是這並不總是被調用。
因此,爲了確保同一客戶端同時沒有多個會話,我在插入新會話之前運行此查詢。
UPDATE Session
SET EndDate = GETDATE()
WHERE ClientID = @ClientID
and EndDate is null
當多個用戶在同一時間連接,根據deadlock graph從而導致死鎖。
我不明白爲什麼這會導致死鎖,
我甚至不明白爲什麼該查詢需要鎖定。
我在做什麼錯?
+1,我現在只需選擇ID(with(nolock)''並且只在需要時更新表。它像一個魅力工作,謝謝。 – 2013-05-02 07:01:01