我正在使用SQL Server 2008 Enterprise。我已经尝试过,如果我将SQL Server事务日志设置为相关数据库的增加(没有备份设置),那么如果多个线程同时执行此存储过程的单个delete语句将导致死锁?有什么想法吗?
对于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
答案 0 :(得分:4)
根据经验,您应该始终在具有FOREIGN KEY约束的列上创建索引。否则,很可能发生死锁(因为服务器必须锁定整个依赖表以确保约束)