我有一个保存客户端连接和断开连接时间的表。
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
根据死锁图,当多个客户端同时连接时会导致死锁。
我不明白为什么这会导致死锁,
我什至不明白为什么该查询需要锁。
我究竟做错了什么?