我在一个SQL Server应用程序中遇到了死锁。我运行了SQL Profiler并打开了“死锁图”,它告诉我两个进程都持有并等待对同一主键索引上的锁。
死锁是由对表的更新引起的,有多个线程在运行,而且两个进程都在运行相同的更新存储过程(尽管使用不同的参数)。这很好,因为存储过程只会增加计数器,所以以前的数据状态并不重要。
即:UPDATE xxx SET yyy = yyy + zzz WHERE aaa = @aaa
以下是需要回答的问题:
1.为什么两个进程都已经持有X锁,还要请求U锁?他们不可能都使用X锁执行更新吗?
2.两个进程如何同时获取X锁?
3.我该如何解决这个问题? :-)
感谢您的帮助。
附加信息:
确切的存储过程是:
索引只是一个int主键聚集索引。
死锁是由对表的更新引起的,有多个线程在运行,而且两个进程都在运行相同的更新存储过程(尽管使用不同的参数)。这很好,因为存储过程只会增加计数器,所以以前的数据状态并不重要。
即:UPDATE xxx SET yyy = yyy + zzz WHERE aaa = @aaa
以下是需要回答的问题:
1.为什么两个进程都已经持有X锁,还要请求U锁?他们不可能都使用X锁执行更新吗?
2.两个进程如何同时获取X锁?
3.我该如何解决这个问题? :-)
感谢您的帮助。
附加信息:
确切的存储过程是:
CREATE PROC spuPlayerStats
@PlayerId int,
@HandsPlayed int
AS
BEGIN
UPDATE Player
SET
HandsPlayed = HandsPlayed + @HandsPlayed
WHERE
PlayerId = @PlayerId
END
GO
索引只是一个int主键聚集索引。
PlayerID
过滤器的范围扫描中出现重叠范围。不过这似乎仍然是一个极端情况。 - JNK