Я использую SQL Server 2008 Enterprise.И используя ADO.Net + C # + .Net 3.5 + ASP.Net в качестве клиента для доступа к базе данных.Когда я обращаюсь к таблицам SQL Server 2008, я всегда вызываю хранимую процедуру из своего кода C # + ADO.Net.
У меня есть 3 операции над таблицей FooTable.И множественные соединения будут выполнять их одновременно в последовательностях, то есть выполняет удаление, выполнение вставки и затем выполнение выбора. Каждый оператор (удаление / вставка / выбор) представляет собой отдельную отдельную транзакцию в процедуре единого хранилища.
Мой вопрос заключается в том, возможно ли возникновение тупика в операторе удаления? Я полагаю, возможно ли возникновение взаимоблокировки, если несколько подключений работают с одним и тем же значением Param1?
Кстати: для приведенных ниже инструкций 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)