我有保存客户端的连接和断开时间的表。如何避免简单更新语句的死锁?
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