我正在使用 SQL Server 2008 Enterprise。并使用ADO.Net + C# + .Net 3.5 + ASP.Net作为客户端访问数据库。当我访问 SQL Server 2008 表时,我总是从 C# + ADO.Net 代码调用存储过程。
我对表 FooTable 有 3 个操作。而多个连接会同时按顺序执行它们,即执行删除,执行插入,然后执行选择。每个语句(删除/插入/选择)都是单个存储过程中的单独事务。
我的问题是delete语句是否有可能发生死锁?我的猜测是,如果多个连接对同一个Param1值进行操作,是否有可能发生死锁?
BTW:对于下面的语句,Param1是表FooTable的列,Param1是另一个表的外键(指另一个表的另一个主键聚集索引列)。 Param1 本身没有表 FooTable 的索引。 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
这是活动监视器表的样子,
ProcessID System Process Login Database Status Opened transaction Command Application Wait Time Wait Type CPU
52 No Foo suspended 0 DELETE .Net SqlClient Data Provider 4882 LCK_M_U 0
53 No George Foo suspended 2 DELETE .Net SqlClient Data Provider 12332 LCK_M_U 0
54 No George Foo suspended 2 DELETE .Net SqlClient Data Provider 6505 LCK_M_U 0
(a lot of rows like the row for process ID 54)