【发布时间】:2013-05-01 14:41:24
【问题描述】:
我有一个表格来保存客户端的连接和断开时间。
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,当多个客户端同时连接时会导致死锁。
我不明白为什么这会导致死锁,
我什至不明白为什么该查询需要锁定。
我做错了什么?
【问题讨论】:
标签: sql-server asynchronous sql-update relational-database database-deadlocks