我正在使用SQL Server 2008 Enterprise。我想知道为什么即使这个存储过程的单个删除语句会导致死锁,如果多个线程同时执行?为什么单个SQL删除语句会导致死锁?
对于delete语句,Param1是表FooTable的列,Param1是另一个表的外键(引用另一个表的另一个主键聚簇索引列)。对于表FooTable,Param1本身没有索引。 FooTable有另一列用作聚集主键,但不是Param1列。
create PROCEDURE [dbo].[FooProc]
(
@Param1 int
,@Param2 int
,@Param3 int
)
AS
DELETE FooTable WHERE Param1 = @Param1
INSERT INTO FooTable
(
Param1
,Param2
,Param3
)
VALUES
(
@Param1
,@Param2
,@Param3
)
DECLARE @ID bigint
SET @ID = ISNULL(@@Identity,-1)
IF @ID > 0
BEGIN
SELECT IdentityStr FROM FooTable WHERE ID = @ID
END
由于事先 乔治
捕获死锁图并将其添加到您的帖子。直到那时,我们都在猜测。有关如何捕获死锁图的信息,请参见http://msdn.microsoft.com/en-us/library/ms190465.aspx。 – 2010-06-05 20:53:28
嗨Remus,如何触发死锁?任何工具或示例代码来进行压力测试? – George2 2010-06-06 07:18:39
通过查看您的过程,我注意到您删除基于Param1的所有行,然后只插入1行。你不能使用UPDATE语句吗? – ZippyV 2010-06-07 07:45:30