Я использую SQL Server 2008 Enterprise. Мне интересно, вызвана ли проблема мертвой блокировки только взаимными зависимостями (например, задача A имеет блокировку на L1, но ожидает блокировки на L2, и в то же время задача B имеет блокировку на L2, но ожидает блокировки на L1)? Существуют ли другие причины и сценарии, которые могут привести к тупику?
Существуют ли другие способы, которые могут привести к блокировке - например, тайм-аут (оператор S / I / D / U не возвращается в течение очень долгого времени, и будет возвращена ошибка взаимоблокировки) или не может получить блокировку в течение длительного времени, но не вызван перекрестными зависимостями (например, задача C должна получить блокировка таблицы T, но другая задача D получает блокировку таблицы T без снятия блокировки, что приводит к тому, что задача C не может получить блокировку таблицы T в течение длительного времени)?
РЕДАКТИРОВАТЬ 1: вызовет ли эта процедура сохранения взаимоблокировку, если она выполняется несколькими потоками одновременно?
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
спасибо заранее,
George