Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите разобраться с deadlock  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Здравствуйте !!!
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64) Aug 19 2014 12:21:34 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

Столкнулся с тем что на одном из серверов ms sql где крутятся базы VMM 2012 постоянно от него ловлю сообщения дедлоков в журнале ms sql. До этого с дедлоками разбираться не приходилось, подскажите как понять всю эту информацию, как действовать ?
ДатаИсточникСерьезностьСообщение
06/03/2015 13:45:09spid28sНеизвестноThe activated proc '[LakeSideLockLogger].[_LakeSide_DbTools_DeadlockMonitor]' running on queue 'msdb.LakeSideLockLogger._LakeSide_DbTools_DeadlockQueue' output the following: 'Invalid object name '_LakeSide_DbTools_DeadlockLog'.'
06/03/2015 13:45:08spid28sНеизвестноThe activated proc '[LakeSideLockLogger].[_LakeSide_DbTools_DeadlockMonitor]' running on queue 'msdb.LakeSideLockLogger._LakeSide_DbTools_DeadlockQueue' output the following: 'Invalid object name '_LakeSide_DbTools_DeadlockLog'.'
06/03/2015 13:45:08spid12sНеизвестноwaiter id=process41b3dc8 mode=RangeS-U requestType=wait
06/03/2015 13:45:08spid12sНеизвестноwaiter-list
06/03/2015 13:45:08spid12sНеизвестноowner id=process5474bc8 mode=RangeS-U
06/03/2015 13:45:08spid12sНеизвестноowner-list
06/03/2015 13:45:08spid12sНеизвестноkeylock hobtid=72057598933794816 dbid=15 objectname=VirtualManagerDB.dbo.tbl_VMM_Lock indexname=idx_VMM_Lock id=lock1574f0ca80 mode=RangeS-U associatedObjectId=72057598933794816
06/03/2015 13:45:08spid12sНеизвестноwaiter id=process5474bc8 mode=RangeS-U requestType=wait
06/03/2015 13:45:08spid12sНеизвестноwaiter-list
06/03/2015 13:45:08spid12sНеизвестноowner id=process41b3dc8 mode=RangeS-U
06/03/2015 13:45:08spid12sНеизвестноowner-list
06/03/2015 13:45:08spid12sНеизвестноkeylock hobtid=72057598933794816 dbid=15 objectname=VirtualManagerDB.dbo.tbl_VMM_Lock indexname=idx_VMM_Lock id=lockdc3c81980 mode=RangeS-U associatedObjectId=72057598933794816
06/03/2015 13:45:08spid12sНеизвестноresource-list
06/03/2015 13:45:08spid12sНеизвестноProc [Database Id = 15 Object Id = 1942297979]
06/03/2015 13:45:08spid12sНеизвестноinputbuf
06/03/2015 13:45:08spid12sНеизвестноOR LockType = @WriteLock)
06/03/2015 13:45:08spid12sНеизвестноOR LockType = @FullAccessLock
06/03/2015 13:45:08spid12sНеизвестноAND (LockType = @DeleteLock
06/03/2015 13:45:08spid12sНеизвестноWHERE ObjectID = @ObjectID
06/03/2015 13:45:08spid12sНеизвестноFROM tbl_VMM_Lock WITH (UPDLOCK)
06/03/2015 13:45:08spid12sНеизвестно@ConflictLockType = LockType
06/03/2015 13:45:08spid12sНеизвестно@ConflictTaskID = TaskID<c/>
06/03/2015 13:45:08spid12sНеизвестноSELECT TOP 1
06/03/2015 13:45:08spid12sНеизвестноframe procname=VirtualManagerDB.dbo.prc_VMM_AcquireLock line=75 stmtstart=4250 stmtend=4792 sqlhandle=0x03000f007b1dc57379827c0153a100000100000000000000
06/03/2015 13:45:08spid12sНеизвестноexecutionStack
06/03/2015 13:45:08spid12sНеизвестноprocess id=process41b3dc8 taskpriority=0 logused=212 waitresource=KEY: 15:72057598933794816 (7d8f5e43c953) waittime=1310 ownerId=154684248 transactionname=user_transaction lasttranstarted=2015-06-03T13:45:07.213 XDES=0x3531163b0 lockMode=RangeS-U schedulerid=5 kpid=7472 status=suspended spid=227 sbid=0 ecid=0 priority=0 trancount=1 lastbatchstarted=2015-06-03T13:45:07.213 lastbatchcompleted=2015-06-03T13:45:07.213 clientapp=VirtualMachineManager hostname=S01-CM01 hostpid=2800 loginname=ENERGOMERA\01.VMMService isolationlevel=serializable (4) xactid=154684248 currentdb=15 lockTimeout=4294967295 clientoption1=673185824 clientoption2=128056
06/03/2015 13:45:08spid12sНеизвестноProc [Database Id = 15 Object Id = 1942297979]
06/03/2015 13:45:08spid12sНеизвестноinputbuf
06/03/2015 13:45:08spid12sНеизвестноOR LockType = @WriteLock)
06/03/2015 13:45:08spid12sНеизвестноOR LockType = @FullAccessLock
06/03/2015 13:45:08spid12sНеизвестноAND (LockType = @DeleteLock
06/03/2015 13:45:08spid12sНеизвестноWHERE ObjectID = @ObjectID
06/03/2015 13:45:08spid12sНеизвестноFROM tbl_VMM_Lock WITH (UPDLOCK)
06/03/2015 13:45:08spid12sНеизвестно@ConflictLockType = LockType
06/03/2015 13:45:08spid12sНеизвестно@ConflictTaskID = TaskID<c/>
06/03/2015 13:45:08spid12sНеизвестноSELECT TOP 1
06/03/2015 13:45:08spid12sНеизвестноframe procname=VirtualManagerDB.dbo.prc_VMM_AcquireLock line=75 stmtstart=4250 stmtend=4792 sqlhandle=0x03000f007b1dc57379827c0153a100000100000000000000
06/03/2015 13:45:08spid12sНеизвестноexecutionStack
06/03/2015 13:45:08spid12sНеизвестноprocess id=process5474bc8 taskpriority=0 logused=212 waitresource=KEY: 15:72057598933794816 (ccbcafd46191) waittime=1310 ownerId=154684237 transactionname=user_transaction lasttranstarted=2015-06-03T13:45:07.210 XDES=0x81f05970 lockMode=RangeS-U schedulerid=11 kpid=4304 status=suspended spid=279 sbid=0 ecid=0 priority=0 trancount=1 lastbatchstarted=2015-06-03T13:45:07.210 lastbatchcompleted=2015-06-03T13:45:07.210 clientapp=VirtualMachineManager hostname=S01-CM01 hostpid=2800 loginname=ENERGOMERA\01.VMMService isolationlevel=serializable (4) xactid=154684237 currentdb=15 lockTimeout=4294967295 clientoption1=673185824 clientoption2=128056
06/03/2015 13:45:08spid12sНеизвестноprocess-list
06/03/2015 13:45:08spid12sНеизвестноdeadlock victim=process5474bc8
06/03/2015 13:45:08spid12sНеизвестноdeadlock-list
06/03/2015 13:45:08spid9sНеизвестноResType:LockOwner Stype:'OR'Xdes:0x0000000081F05970 Mode: RangeS-U SPID:279 BatchID:0 ECID:0 TaskProxy:(0x0000001494490540) Value:0x87801580 Cost:(0/212)
06/03/2015 13:45:08spid9sНеизвестноVictim Resource Owner:
06/03/2015 13:45:08spid9sНеизвестноСредству просмотра журнала не удалось прочитать данные для этой записи журнала. Причина: Неопределенные данные. Этот метод или свойство не может вызываться для неопределенных значений.. Содержимое:
06/03/2015 13:45:08spid9sНеизвестноResType:LockOwner Stype:'OR'Xdes:0x00000003531163B0 Mode: RangeS-U SPID:227 BatchID:0 ECID:0 TaskProxy:(0x00000002BABE8540) Value:0x9050f880 Cost:(0/212)
06/03/2015 13:45:08spid9sНеизвестноRequested by:
06/03/2015 13:45:08spid9sНеизвестноInput Buf: RPC Event: Proc [Database Id = 15 Object Id = 1942297979]
06/03/2015 13:45:08spid9sНеизвестноSPID: 279 ECID: 0 Statement Type: SELECT Line #: 75
06/03/2015 13:45:08spid9sНеизвестноOwner:0x00000007085BE940 Mode: RangeS-U Flg:0x40 Ref:0 Life:02000000 SPID:279 ECID:0 XactLockInfo: 0x0000000081F059B0
06/03/2015 13:45:08spid9sНеизвестноGrant List 2:
06/03/2015 13:45:08spid9sНеизвестноKEY: 15:72057598933794816 (7d8f5e43c953) CleanCnt:2 Mode:RangeS-U Flags: 0x1
06/03/2015 13:45:08spid9sНеизвестноNode:2
06/03/2015 13:45:08spid9sНеизвестноСредству просмотра журнала не удалось прочитать данные для этой записи журнала. Причина: Неопределенные данные. Этот метод или свойство не может вызываться для неопределенных значений.. Содержимое:
06/03/2015 13:45:08spid9sНеизвестноResType:LockOwner Stype:'OR'Xdes:0x0000000081F05970 Mode: RangeS-U SPID:279 BatchID:0 ECID:0 TaskProxy:(0x0000001494490540) Value:0x87801580 Cost:(0/212)
06/03/2015 13:45:08spid9sНеизвестноRequested by:
06/03/2015 13:45:08spid9sНеизвестноInput Buf: RPC Event: Proc [Database Id = 15 Object Id = 1942297979]
06/03/2015 13:45:08spid9sНеизвестноSPID: 227 ECID: 0 Statement Type: SELECT Line #: 75
06/03/2015 13:45:08spid9sНеизвестноOwner:0x00000009ED16A500 Mode: RangeS-U Flg:0x40 Ref:0 Life:02000000 SPID:227 ECID:0 XactLockInfo: 0x00000003531163F0
06/03/2015 13:45:08spid9sНеизвестноGrant List 1:
06/03/2015 13:45:08spid9sНеизвестноKEY: 15:72057598933794816 (ccbcafd46191) CleanCnt:3 Mode:RangeS-U Flags: 0x1
06/03/2015 13:45:08spid9sНеизвестноNode:1
06/03/2015 13:45:08spid9sНеизвестноСредству просмотра журнала не удалось прочитать данные для этой записи журнала. Причина: Неопределенные данные. Этот метод или свойство не может вызываться для неопределенных значений.. Содержимое:
06/03/2015 13:45:08spid9sНеизвестноWait-for graph
06/03/2015 13:45:08spid9sНеизвестноDeadlock encountered .... Printing deadlock information

Картинка с другого сайта.

К сообщению приложен файл (deadlock_1.xdl - 7Kb) cкачать
4 июн 15, 12:41    [17729749]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
stavgreengo,

если точная причина нужна, то киньте код "между" begin tran и commit/rollbac tran.

а так - похоже на различный порядок блокировки ресурсов. по коду - выше селектов которые отражены в deadlock графе, скорей всего уже что-то захватило эти блокировки.
4 июн 15, 13:28    [17730071]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Вот T-SQL код одной и той же ХП которая отражена в обоих овалах графа.
USE [VirtualManagerDB]
GO
/****** Object:  StoredProcedure [dbo].[prc_VMM_AcquireLock]    Script Date: 06/04/2015 14:09:45 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


/**
  *     Stored procedure for AcquireLock
  *     @ObjectID - object ID
  *     @ObjectType - object type
  *     @TaskID   - Task ID requesting lock
  *     @ReqLockType - Type of lock requested 
                            0'NoDelete' for NoDeleteLock, 
                            1'Read' for ReadLock, 
                            2'Write' for Write lock,
                            3'Delete' for Delete lock, 
                            3'FullAccess' for FullAccess lock
  */
ALTER PROCEDURE [dbo].[prc_VMM_AcquireLock] 
(
    @ObjectID GUID,
    @ObjectType nvarchar(50),
    @TaskID GUID,
    @ReqLockType tinyint,
    @ConflictTaskID GUID output,
    @ConflictLockType tinyint output
)
AS

DECLARE  @NoDeleteLock tinyint,
         @ReadLock tinyint,
         @WriteLock tinyint,
         @DeleteLock tinyint,
         @FullAccessLock tinyint,
         @AcquireLockError int,
         @error int,
         @rowCount int,
         @tranPoint sysname

SET @error = 0
SET @rowCount = 0 
SET @tranPoint = OBJECT_NAME(@@procID) + CAST(@@nestlevel AS varchar(10))
   
SET @NoDeleteLock = 0 --N'NoDelete'
SET @ReadLock = 1 --N'Read'
SET @WriteLock = 2 --N'Write'
SET @DeleteLock = 3 --N'Delete'
SET @FullAccessLock = 3 --N'FullAccess'
SET @AcquireLockError = 50003

SET NOCOUNT ON

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRAN
SAVE TRAN @tranPoint

IF(@ReqLockType = @NoDeleteLock)
BEGIN

    --If some one is holding DeleteLock or FullAccessLock we can't acquire NoDelete Lock
    SELECT TOP 1 
           @ConflictTaskID = TaskID,
           @ConflictLockType = LockType
    FROM tbl_VMM_Lock WITH (UPDLOCK)
    WHERE ObjectID = @ObjectID
    AND   (LockType = @DeleteLock
    OR     LockType = @FullAccessLock)

    SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT
    IF (@error = 0 AND @rowCount <> 0)
    BEGIN
        SET @error = @AcquireLockError
        GOTO ErrorRollback
    END
END
ELSE IF(@ReqLockType = @ReadLock)
BEGIN
    --If some one is holding DeleteLock or FullAccessLock or WriteLock we can't acquire Read Lock
    SELECT TOP 1
        @ConflictTaskID = TaskID,
        @ConflictLockType = LockType
    FROM tbl_VMM_Lock WITH (UPDLOCK)
    WHERE ObjectID = @ObjectID
    AND   (LockType = @DeleteLock
    OR     LockType = @FullAccessLock
    OR     LockType = @WriteLock)

    SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT
    IF (@error = 0 AND @rowCount <> 0)
    BEGIN
        SET @error = @AcquireLockError
        GOTO ErrorRollback
    END
END
ELSE IF(@ReqLockType = @WriteLock)
BEGIN
    --If some one is holding DeleteLock or FullAccessLock or WriteLock or ReadLock we can't acquire Write Lock
    SELECT TOP 1
        @ConflictTaskID = TaskID,
        @ConflictLockType = LockType
    FROM tbl_VMM_Lock WITH (UPDLOCK)
    WHERE ObjectID = @ObjectID
    AND   (LockType = @DeleteLock
    OR     LockType = @FullAccessLock
    OR     LockType = @WriteLock 
    OR     LockType = @ReadLock)

    SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT
    IF (@error = 0 AND @rowCount <> 0)
    BEGIN
        SET @error = @AcquireLockError
        GOTO ErrorRollback
    END
END
ELSE
BEGIN
    --If some one is holding any lock we can't acquire Delete or FullAccess Lock
    SELECT TOP 1
        @ConflictTaskID = TaskID,
        @ConflictLockType = LockType
    FROM tbl_VMM_Lock WITH (UPDLOCK)
    WHERE ObjectID = @ObjectID
    AND   (LockType = @DeleteLock
    OR     LockType = @FullAccessLock
    OR     LockType = @WriteLock
    OR     LockType = @ReadLock
    OR     LockType = @NoDeleteLock)

    SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT
    IF (@error = 0 AND @rowCount <> 0)
    BEGIN
        SET @error = @AcquireLockError
        GOTO ErrorRollback
    END
END
   
--Just insert specific row to acquire lock once above conditions are met
INSERT INTO tbl_VMM_Lock
   (
    ObjectID,
    ObjectType,
    TaskID,
    LockType
   )
VALUES
   (
    @ObjectID,
    @ObjectType,
    @TaskID,
    @ReqLockType
   )
 
SET @error = @@ERROR
IF (@error <> 0)
    GOTO ErrorRollback
    
GOTO Success
    
ErrorRollback:
    ROLLBACK TRAN @tranPoint
Success:    
    COMMIT TRAN
    SET NOCOUNT OFF
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
RETURN @error
4 июн 15, 14:11    [17730390]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8570
Deadlock всегда есть на сервере при выполнении многопользовательских запросов с update и insert. Можно лишь попытаться уменьшить их количество. Первое, что нужно сделать - перестроить индексы.
4 июн 15, 14:14    [17730405]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Стало понятно наличие блокировок RangeS-U на дедлок графе
Подсказки блокировки ROWLOCK, UPDLOCK и XLOCK, накладывающие блокировку уровня строки, могут накладывать блокировки на ключи индекса вместо фактических строк данных. Например, если для таблицы имеется некластеризованный индекс, а инструкция SELECT обрабатывается покрывающим индексом с использованием подсказки блокировки, блокировка накладывается на ключ покрывающего индекса вместо строки данных в базовой таблице.

Но по прежнему не понятно что дальше делать) и как из ситуации выйти
4 июн 15, 14:17    [17730427]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Владислав Колосов
Deadlock всегда есть на сервере при выполнении многопользовательских запросов с update и insert. Можно лишь попытаться уменьшить их количество. Первое, что нужно сделать - перестроить индексы.

да там таблица в одну строку значений)
ObjectID ObjectType TaskID LockType
AA3885AE-8CB6-400F-B7DF-52ACAD5D3D7F AgentServer 76863843-7B87-41A2-954C-54C4D5C441DB 3

Постоянно происходит попытка её перезаписать. Что это за ObjectID там отражён ? Это не из [sys].[objects]. Записи которые пытаются прописаться в качестве update имеют один и тот же ObjectID но разный TaskID
4 июн 15, 14:23    [17730461]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
stavgreengo,

...у вас в каждом запросе ето чудо вызываеться ?
Сериализабле с апдлоком + зачемто вычитка переменных..если интересует простой нот екзист....намутили все в кучу
4 июн 15, 14:27    [17730490]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
invm
Member

Откуда: Москва
Сообщений: 9721
stavgreengo
да там таблица в одну строку значений
Судя по графу, у вас там, как минимум, две строки.
4 июн 15, 18:24    [17732090]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
stavgreengo,

погонял хранимку параллельно в неск сессиях, дованговал схему и индекс. никаких дедлоков не поймал

CREATE TABLE [dbo].[tbl_VMM_Lock](
	[ObjectID] [uniqueidentifier] NULL,
	[ObjectType] [nvarchar](50) NULL,
	[TaskID] [uniqueidentifier] NULL,
	[LockType] [tinyint] NULL
) ON [PRIMARY]

GO

CREATE UNIQUE CLUSTERED INDEX [idx__tbl_VMM_Lock] ON [dbo].[tbl_VMM_Lock]
(
	[ObjectID] ASC,
	[LockType] ASC
)WITH 
(
ALLOW_ROW_LOCKS = ON, 
ALLOW_PAGE_LOCKS = OFF
)
GO


ALTER PROCEDURE [dbo].[prc_VMM_AcquireLock] 
(
    @ObjectID UNIQUEIDENTIFIER,
    @ObjectType nvarchar(50),
    @TaskID UNIQUEIDENTIFIER,
    @ReqLockType tinyint,
    @ConflictTaskID UNIQUEIDENTIFIER output,
    @ConflictLockType tinyint output
)
AS

...
-- всем подобным селектам прописал хинт INDEX([idx__tbl_VMM_Lock])
    SELECT TOP 1
        @ConflictTaskID = TaskID,
        @ConflictLockType = LockType
    FROM tbl_VMM_Lock WITH (UPDLOCK, INDEX([idx__tbl_VMM_Lock]))
    WHERE ObjectID = @ObjectID
    AND   (LockType = @DeleteLock
    OR     LockType = @FullAccessLock
    OR     LockType = @WriteLock)
...
RETURN @error


а какая схема на самом деле?

и еще в коде

SET @DeleteLock = 3 --N'Delete'
SET @FullAccessLock = 3 --N'FullAccess'


У обоих 3?
4 июн 15, 18:36    [17732141]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
автор

INDEX([idx__tbl_VMM_Lock]) можно выкинуть. это был тест с некластерным индексом.

4 июн 15, 18:38    [17732153]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Да и картинка в профайлере предсказуемая была по блокировкам.
4 июн 15, 18:41    [17732164]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
Там в предикатах OR стоят.

    SELECT TOP 1
        @ConflictTaskID = TaskID,
        @ConflictLockType = LockType
    FROM tbl_VMM_Lock WITH (UPDLOCK)
    WHERE ObjectID = @ObjectID
    AND   (LockType = @DeleteLock 
    OR     LockType = @FullAccessLock 
    OR     LockType = @WriteLock 
    OR     LockType = @ReadLock 
    OR     LockType = @NoDeleteLock) 

План вот

StmtText
  |--Top(TOP EXPRESSION:((1)))
       |--Nested Loops(Inner Join, OUTER REFERENCES:([Expr1017], [Expr1018], [Expr1019]))
            |--Merge Interval
            |    |--Sort(TOP 5, ORDER BY:([Expr1020] DESC, [Expr1021] ASC, [Expr1017] ASC, [Expr1022] DESC))
            |         |--Compute Scalar(DEFINE:([Expr1020]=((4)&[Expr1019]) = (4) AND NULL = [Expr1017], [Expr1021]=(4)&[Expr1019], [Expr1022]=(16)&[Expr1019]))
            |              |--Concatenation
            |                   |--Compute Scalar(DEFINE:([Expr1003]=[@DeleteLock], [Expr1004]=[@DeleteLock], [Expr1002]=(62)))
            |                   |    |--Constant Scan
            |                   |--Compute Scalar(DEFINE:([Expr1006]=[@FullAccessLock], [Expr1007]=[@FullAccessLock], [Expr1005]=(62)))
            |                   |    |--Constant Scan
            |                   |--Compute Scalar(DEFINE:([Expr1009]=[@WriteLock], [Expr1010]=[@WriteLock], [Expr1008]=(62)))
            |                   |    |--Constant Scan
            |                   |--Compute Scalar(DEFINE:([Expr1012]=[@ReadLock], [Expr1013]=[@ReadLock], [Expr1011]=(62)))
            |                   |    |--Constant Scan
            |                   |--Compute Scalar(DEFINE:([Expr1015]=[@NoDeleteLock], [Expr1016]=[@NoDeleteLock], [Expr1014]=(62)))
            |                        |--Constant Scan
            |--Clustered Index Seek(OBJECT:([clean].[dbo].[tbl_VMM_Lock].[idx__tbl_VMM_Lock]), SEEK:([clean].[dbo].[tbl_VMM_Lock].[ObjectID]=newid() AND [clean].[dbo].[tbl_VMM_Lock].[LockType] > [Expr1017] AND [clean].[dbo].[tbl_VMM_Lock].[LockType] < [Expr1018]) ORDERED FORWARD)


И есть такое предположение, что Seek'и в общем случае ну будут выполняться всегда в одном и том же порядке.
4 июн 15, 19:58    [17732491]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Оригинальные структуры:
таблица
USE [VirtualManagerDB]
GO

/****** Object:  Table [dbo].[tbl_VMM_Lock]    Script Date: 06/05/2015 08:56:54 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tbl_VMM_Lock](
	[ObjectID] [dbo].[guid] NOT NULL,
	[ObjectType] [nvarchar](50) NOT NULL,
	[TaskID] [dbo].[guid] NOT NULL,
	[LockType] [tinyint] NOT NULL
) ON [PRIMARY]

GO

индекс
USE [VirtualManagerDB]
GO

/****** Object:  Index [idx_VMM_Lock]    Script Date: 06/05/2015 08:59:23 ******/
CREATE CLUSTERED INDEX [idx_VMM_Lock] ON [dbo].[tbl_VMM_Lock] 
(
	[ObjectID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
GO

churupaha, спасибо Вам большое, сейчас тоже оттестирую ваше предложение.
5 июн 15, 09:13    [17733708]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
stavgreengo,

ну и попробуйте все ваши иф - заменить 1 нот екзист по покрывавему условию ?
    SELECT TOP 1
        @ConflictTaskID = TaskID,
        @ConflictLockType = LockType
    FROM tbl_VMM_Lock WITH (UPDLOCK)
    WHERE ObjectID = @ObjectID
    AND   (LockType = @DeleteLock
    OR     LockType = @FullAccessLock
    OR     LockType = @WriteLock
    OR     LockType = @ReadLock
    OR     LockType = @NoDeleteLock)

    SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT
    IF (@error = 0 AND @rowCount <> 0)
    BEGIN
        SET @error = @AcquireLockError
        GOTO ErrorRollback
    END


Вас все равно интересует ситуация когда записи НЕТ....в любом другом случае вы ролбек делаете
5 июн 15, 09:18    [17733726]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
stavgreengo
churupaha, спасибо Вам большое, сейчас тоже оттестирую ваше предложение.


вечером будет время, погляжу с таким индексом. или вы киньте сюда планы выполнения этой хранимки. и для ориентиру скока строк в таблице в вашей. и сколько строк для одного объекта ObjectID (индекс кластерный НЕ уникальный у вас на ObjectID).

и лучше посмотрите мой последний пост. есть такие предположения:

1) или для разных сессий построены разные планы и потому порядок захвата Range-блокировок разный
2) или план один и тот же, но не гарантирует один и тот же порядок захвата Range-блокировок (хз)

надо проверять.
5 июн 15, 09:24    [17733751]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
автор
где крутятся базы VMM 2012


и еще вам бы схему не менять самим. это не ваша система? в техподдержке могут и отказать потом. выяснить причину и запостить им письмецо мол такая ситуация...
5 июн 15, 09:32    [17733799]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
churupaha
stavgreengo
churupaha, спасибо Вам большое, сейчас тоже оттестирую ваше предложение.


вечером будет время, погляжу с таким индексом. или вы киньте сюда планы выполнения этой хранимки. и для ориентиру скока строк в таблице в вашей. и сколько строк для одного объекта ObjectID (индекс кластерный НЕ уникальный у вас на ObjectID).

и лучше посмотрите мой последний пост. есть такие предположения:

1) или для разных сессий построены разные планы и потому порядок захвата Range-блокировок разный
2) или план один и тот же, но не гарантирует один и тот же порядок захвата Range-блокировок (хз)

надо проверять.

С оригинальной ХП 17730390 и структурами 17733708 план выполнения для object_id ХП единственный и таков
+ xml
<ShowPlanXML xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan" Version="1.1" Build="10.50.6000.34">
<BatchSequence>
<Batch>
<Statements>
<StmtSimple StatementText=" /** * Stored procedure for AcquireLock * @ObjectID - object ID * @ObjectType - object type * @TaskID - Task ID requesting lock * @ReqLockType - Type of lock requested 0'NoDelete' for NoDeleteLock, 1'Read' for ReadLock, 2'Write' for Write lock, 3'Delete' for Delete lock, 3'FullAccess' for FullAccess lock */ CREATE PROCEDURE [dbo].[prc_VMM_AcquireLock] ( @ObjectID GUID, @ObjectType nvarchar(50), @TaskID GUID, @ReqLockType tinyint, @ConflictTaskID GUID output, @ConflictLockType tinyint output ) AS DECLARE @NoDeleteLock tinyint, @ReadLock tinyint, @WriteLock tinyint, @DeleteLock tinyint, @FullAccessLock tinyint, @AcquireLockError int, @error int, @rowCount int, @tranPoint sysname SET @error = 0 " StatementId="1" StatementCompId="2" StatementType="ASSIGN" />
<StmtSimple StatementText=" SET @rowCount = 0 " StatementId="2" StatementCompId="3" StatementType="ASSIGN" />
<StmtSimple StatementText=" SET @tranPoint = OBJECT_NAME(@@procID) + CAST(@@nestlevel AS varchar(10)) " StatementId="3" StatementCompId="4" StatementType="ASSIGN" />
<StmtSimple StatementText=" SET @NoDeleteLock = 0 --N'NoDelete' " StatementId="4" StatementCompId="5" StatementType="ASSIGN" />
<StmtSimple StatementText=" SET @ReadLock = 1 --N'Read' " StatementId="5" StatementCompId="6" StatementType="ASSIGN" />
<StmtSimple StatementText=" SET @WriteLock = 2 --N'Write' " StatementId="6" StatementCompId="7" StatementType="ASSIGN" />
<StmtSimple StatementText=" SET @DeleteLock = 3 --N'Delete' " StatementId="7" StatementCompId="8" StatementType="ASSIGN" />
<StmtSimple StatementText=" SET @FullAccessLock = 3 --N'FullAccess' " StatementId="8" StatementCompId="9" StatementType="ASSIGN" />
<StmtSimple StatementText=" SET @AcquireLockError = 50003 " StatementId="9" StatementCompId="10" StatementType="ASSIGN" />
<StmtSimple StatementText=" SET NOCOUNT ON " StatementId="10" StatementCompId="11" StatementType="SET ON/OFF" />
<StmtSimple StatementText=" SET TRANSACTION ISOLATION LEVEL SERIALIZABLE " StatementId="11" StatementCompId="12" StatementType="SET TRANSACTION ISOLATION LEVEL" />
<StmtSimple StatementText=" BEGIN TRAN " StatementId="12" StatementCompId="13" StatementType="BEGIN TRANSACTION" />
<StmtSimple StatementText=" SAVE TRAN @tranPoint " StatementId="13" StatementCompId="14" StatementType="SAVE TRANSACTION" />
<StmtCond StatementText=" IF(@ReqLockType = @NoDeleteLock) " StatementId="14" StatementCompId="15" StatementType="COND">
<Condition />
<Then>
<Statements>
<StmtSimple StatementText=" BEGIN --If some one is holding DeleteLock or FullAccessLock we can't acquire NoDelete Lock SELECT TOP 1 @ConflictTaskID = TaskID, @ConflictLockType = LockType FROM tbl_VMM_Lock WITH (UPDLOCK) WHERE ObjectID = @ObjectID AND (LockType = @DeleteLock OR LockType = @FullAccessLock) " StatementId="15" StatementCompId="16" StatementType="SELECT" StatementSubTreeCost="0.00328408" StatementEstRows="1" StatementOptmLevel="FULL" QueryHash="0xB4B070AAD89F9951" QueryPlanHash="0xB55871E948962E24" StatementOptmEarlyAbortReason="GoodEnoughPlanFound">
<StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false" />
<QueryPlan CachedPlanSize="16" CompileTime="1" CompileCPU="1" CompileMemory="144">
<RelOp NodeId="0" PhysicalOp="Top" LogicalOp="Top" EstimateRows="1" EstimateIO="0" EstimateCPU="1e-007" AvgRowSize="24" EstimatedTotalSubtreeCost="0.00328408" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
<OutputList>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</OutputList>
<Top RowCount="0" IsPercent="0" WithTies="0">
<TopExpression>
<ScalarOperator ScalarString="(1)">
<Const ConstValue="(1)" />
</ScalarOperator>
</TopExpression>
<RelOp NodeId="1" PhysicalOp="Clustered Index Seek" LogicalOp="Clustered Index Seek" EstimateRows="1" EstimateIO="0.003125" EstimateCPU="0.0001581" AvgRowSize="24" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="0" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
<OutputList>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</OutputList>
<IndexScan Ordered="1" ScanDirection="FORWARD" ForcedIndex="0" ForceSeek="0" ForceScan="0" NoExpandHint="0">
<DefinedValues>
<DefinedValue>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</DefinedValue>
</DefinedValues>
<Object Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Index="[idx_VMM_Lock]" IndexKind="Clustered" />
<SeekPredicates>
<SeekPredicateNew>
<SeekKeys>
<Prefix ScanType="EQ">
<RangeColumns>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="ObjectID" />
</RangeColumns>
<RangeExpressions>
<ScalarOperator ScalarString="[@ObjectID]">
<Identifier>
<ColumnReference Column="@ObjectID" />
</Identifier>
</ScalarOperator>
</RangeExpressions>
</Prefix>
</SeekKeys>
</SeekPredicateNew>
</SeekPredicates>
<Predicate>
<ScalarOperator ScalarString="[VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@DeleteLock] OR [VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@FullAccessLock]">
<Logical Operation="OR">
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@DeleteLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@FullAccessLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
</Logical>
</ScalarOperator>
</Predicate>
</IndexScan>
</RelOp>
</Top>
</RelOp>
<ParameterList>
<ColumnReference Column="@ConflictLockType" ParameterCompiledValue="NULL" />
<ColumnReference Column="@ConflictTaskID" ParameterCompiledValue="NULL" />
<ColumnReference Column="@ObjectID" ParameterCompiledValue="{guid'53B15C56-EAF3-4083-8DE4-FC813625180E'}" />
</ParameterList>
</QueryPlan>
</StmtSimple>
<StmtSimple StatementText=" SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT " StatementId="16" StatementCompId="17" StatementType="ASSIGN" />
<StmtCond StatementText=" IF (@error = 0 AND @rowCount <> 0) " StatementId="17" StatementCompId="18" StatementType="COND">
<Condition />
<Then>
<Statements>
<StmtSimple StatementText=" BEGIN SET @error = @AcquireLockError " StatementId="18" StatementCompId="19" StatementType="ASSIGN" />
<StmtSimple StatementText=" GOTO ErrorRollback " StatementId="19" StatementCompId="20" StatementType="GOTO" />
</Statements>
</Then>
</StmtCond>
</Statements>
</Then>
<Else>
<Statements>
<StmtCond StatementText=" END END ELSE IF(@ReqLockType = @ReadLock) " StatementId="20" StatementCompId="24" StatementType="COND">
<Condition />
<Then>
<Statements>
<StmtSimple StatementText=" BEGIN --If some one is holding DeleteLock or FullAccessLock or WriteLock we can't acquire Read Lock SELECT TOP 1 @ConflictTaskID = TaskID, @ConflictLockType = LockType FROM tbl_VMM_Lock WITH (UPDLOCK) WHERE ObjectID = @ObjectID AND (LockType = @DeleteLock OR LockType = @FullAccessLock OR LockType = @WriteLock) " StatementId="21" StatementCompId="25" StatementType="SELECT" StatementSubTreeCost="0.00328438" StatementEstRows="1" StatementOptmLevel="FULL" QueryHash="0x02BE55483EF84F7D" QueryPlanHash="0xDA615B7B543DA5CC" StatementOptmEarlyAbortReason="GoodEnoughPlanFound">
<StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false" />
<QueryPlan CachedPlanSize="16" CompileTime="1" CompileCPU="1" CompileMemory="144">
<RelOp NodeId="0" PhysicalOp="Top" LogicalOp="Top" EstimateRows="1" EstimateIO="0" EstimateCPU="1e-007" AvgRowSize="24" EstimatedTotalSubtreeCost="0.00328438" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
<OutputList>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</OutputList>
<Top RowCount="0" IsPercent="0" WithTies="0">
<TopExpression>
<ScalarOperator ScalarString="(1)">
<Const ConstValue="(1)" />
</ScalarOperator>
</TopExpression>
<RelOp NodeId="1" PhysicalOp="Clustered Index Seek" LogicalOp="Clustered Index Seek" EstimateRows="1" EstimateIO="0.003125" EstimateCPU="0.0001581" AvgRowSize="24" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="9" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
<OutputList>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</OutputList>
<IndexScan Ordered="1" ScanDirection="FORWARD" ForcedIndex="0" ForceSeek="0" ForceScan="0" NoExpandHint="0">
<DefinedValues>
<DefinedValue>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</DefinedValue>
</DefinedValues>
<Object Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Index="[idx_VMM_Lock]" IndexKind="Clustered" />
<SeekPredicates>
<SeekPredicateNew>
<SeekKeys>
<Prefix ScanType="EQ">
<RangeColumns>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="ObjectID" />
</RangeColumns>
<RangeExpressions>
<ScalarOperator ScalarString="[@ObjectID]">
<Identifier>
<ColumnReference Column="@ObjectID" />
</Identifier>
</ScalarOperator>
</RangeExpressions>
</Prefix>
</SeekKeys>
</SeekPredicateNew>
</SeekPredicates>
<Predicate>
<ScalarOperator ScalarString="[VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@DeleteLock] OR [VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@FullAccessLock] OR [VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@WriteLock]">
<Logical Operation="OR">
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@DeleteLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@FullAccessLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@WriteLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
</Logical>
</ScalarOperator>
</Predicate>
</IndexScan>
</RelOp>
</Top>
</RelOp>
<ParameterList>
<ColumnReference Column="@ConflictLockType" ParameterCompiledValue="NULL" />
<ColumnReference Column="@ConflictTaskID" ParameterCompiledValue="NULL" />
<ColumnReference Column="@ObjectID" ParameterCompiledValue="{guid'A4959488-A31C-461F-8E9A-5187EF2DFB6B'}" />
</ParameterList>
</QueryPlan>
</StmtSimple>
<StmtSimple StatementText=" SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT " StatementId="22" StatementCompId="26" StatementType="ASSIGN" />
<StmtCond StatementText=" IF (@error = 0 AND @rowCount <> 0) " StatementId="23" StatementCompId="27" StatementType="COND">
<Condition />
<Then>
<Statements>
<StmtSimple StatementText=" BEGIN SET @error = @AcquireLockError " StatementId="24" StatementCompId="28" StatementType="ASSIGN" />
<StmtSimple StatementText=" GOTO ErrorRollback " StatementId="25" StatementCompId="29" StatementType="GOTO" />
</Statements>
</Then>
</StmtCond>
</Statements>
</Then>
<Else>
<Statements>
<StmtCond StatementText=" END END ELSE IF(@ReqLockType = @WriteLock) " StatementId="26" StatementCompId="33" StatementType="COND">
<Condition />
<Then>
<Statements>
<StmtSimple StatementText=" BEGIN --If some one is holding DeleteLock or FullAccessLock or WriteLock or ReadLock we can't acquire Write Lock SELECT TOP 1 @ConflictTaskID = TaskID, @ConflictLockType = LockType FROM tbl_VMM_Lock WITH (UPDLOCK) WHERE ObjectID = @ObjectID AND (LockType = @DeleteLock OR LockType = @FullAccessLock OR LockType = @WriteLock OR LockType = @ReadLock) " StatementId="27" StatementCompId="34" StatementType="SELECT" StatementSubTreeCost="0.00328468" StatementEstRows="1" StatementOptmLevel="FULL" QueryHash="0x08E1164B27990CC6" QueryPlanHash="0x64BEE65C7BDAA9CD" StatementOptmEarlyAbortReason="GoodEnoughPlanFound">
<StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false" />
<QueryPlan CachedPlanSize="16" CompileTime="1" CompileCPU="1" CompileMemory="160">
<RelOp NodeId="0" PhysicalOp="Top" LogicalOp="Top" EstimateRows="1" EstimateIO="0" EstimateCPU="1e-007" AvgRowSize="24" EstimatedTotalSubtreeCost="0.00328468" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
<OutputList>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</OutputList>
<Top RowCount="0" IsPercent="0" WithTies="0">
<TopExpression>
<ScalarOperator ScalarString="(1)">
<Const ConstValue="(1)" />
</ScalarOperator>
</TopExpression>
<RelOp NodeId="1" PhysicalOp="Clustered Index Seek" LogicalOp="Clustered Index Seek" EstimateRows="1" EstimateIO="0.003125" EstimateCPU="0.0001581" AvgRowSize="24" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="1" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
<OutputList>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</OutputList>
<IndexScan Ordered="1" ScanDirection="FORWARD" ForcedIndex="0" ForceSeek="0" ForceScan="0" NoExpandHint="0">
<DefinedValues>
<DefinedValue>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</DefinedValue>
</DefinedValues>
<Object Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Index="[idx_VMM_Lock]" IndexKind="Clustered" />
<SeekPredicates>
<SeekPredicateNew>
<SeekKeys>
<Prefix ScanType="EQ">
<RangeColumns>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="ObjectID" />
</RangeColumns>
<RangeExpressions>
<ScalarOperator ScalarString="[@ObjectID]">
<Identifier>
<ColumnReference Column="@ObjectID" />
</Identifier>
</ScalarOperator>
</RangeExpressions>
</Prefix>
</SeekKeys>
</SeekPredicateNew>
</SeekPredicates>
<Predicate>
<ScalarOperator ScalarString="[VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@DeleteLock] OR [VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@FullAccessLock] OR [VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@WriteLock] OR [VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@ReadLock]">
<Logical Operation="OR">
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@DeleteLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@FullAccessLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@WriteLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@ReadLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
</Logical>
</ScalarOperator>
</Predicate>
</IndexScan>
</RelOp>
</Top>
</RelOp>
<ParameterList>
<ColumnReference Column="@ConflictLockType" ParameterCompiledValue="NULL" />
<ColumnReference Column="@ConflictTaskID" ParameterCompiledValue="NULL" />
<ColumnReference Column="@ObjectID" ParameterCompiledValue="{guid'CC50E461-A878-4C9A-A5BA-4245A12AA534'}" />
</ParameterList>
</QueryPlan>
</StmtSimple>
<StmtSimple StatementText=" SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT " StatementId="28" StatementCompId="35" StatementType="ASSIGN" />
<StmtCond StatementText=" IF (@error = 0 AND @rowCount <> 0) " StatementId="29" StatementCompId="36" StatementType="COND">
<Condition />
<Then>
<Statements>
<StmtSimple StatementText=" BEGIN SET @error = @AcquireLockError " StatementId="30" StatementCompId="37" StatementType="ASSIGN" />
<StmtSimple StatementText=" GOTO ErrorRollback " StatementId="31" StatementCompId="38" StatementType="GOTO" />
</Statements>
</Then>
</StmtCond>
</Statements>
</Then>
<Else>
<Statements>
<StmtSimple StatementText=" END END ELSE BEGIN --If some one is holding any lock we can't acquire Delete or FullAccess Lock SELECT TOP 1 @ConflictTaskID = TaskID, @ConflictLockType = LockType FROM tbl_VMM_Lock WITH (UPDLOCK) WHERE ObjectID = @ObjectID AND (LockType = @DeleteLock OR LockType = @FullAccessLock OR LockType = @WriteLock OR LockType = @ReadLock OR LockType = @NoDeleteLock) " StatementId="32" StatementCompId="42" StatementType="SELECT" StatementSubTreeCost="0.00328498" StatementEstRows="1" StatementOptmLevel="FULL" QueryHash="0x67BBB8687CF491C5" QueryPlanHash="0x18DF2AA9CE94CBCD" StatementOptmEarlyAbortReason="GoodEnoughPlanFound">
<StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false" />
<QueryPlan CachedPlanSize="16" CompileTime="15" CompileCPU="2" CompileMemory="168">
<RelOp NodeId="0" PhysicalOp="Top" LogicalOp="Top" EstimateRows="1" EstimateIO="0" EstimateCPU="1e-007" AvgRowSize="24" EstimatedTotalSubtreeCost="0.00328498" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
<OutputList>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</OutputList>
<Top RowCount="0" IsPercent="0" WithTies="0">
<TopExpression>
<ScalarOperator ScalarString="(1)">
<Const ConstValue="(1)" />
</ScalarOperator>
</TopExpression>
<RelOp NodeId="1" PhysicalOp="Clustered Index Seek" LogicalOp="Clustered Index Seek" EstimateRows="1" EstimateIO="0.003125" EstimateCPU="0.0001581" AvgRowSize="24" EstimatedTotalSubtreeCost="0.0032831" TableCardinality="1" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
<OutputList>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</OutputList>
<IndexScan Ordered="1" ScanDirection="FORWARD" ForcedIndex="0" ForceSeek="0" ForceScan="0" NoExpandHint="0">
<DefinedValues>
<DefinedValue>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
</DefinedValue>
<DefinedValue>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</DefinedValue>
</DefinedValues>
<Object Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Index="[idx_VMM_Lock]" IndexKind="Clustered" />
<SeekPredicates>
<SeekPredicateNew>
<SeekKeys>
<Prefix ScanType="EQ">
<RangeColumns>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="ObjectID" />
</RangeColumns>
<RangeExpressions>
<ScalarOperator ScalarString="[@ObjectID]">
<Identifier>
<ColumnReference Column="@ObjectID" />
</Identifier>
</ScalarOperator>
</RangeExpressions>
</Prefix>
</SeekKeys>
</SeekPredicateNew>
</SeekPredicates>
<Predicate>
<ScalarOperator ScalarString="[VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@DeleteLock] OR [VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@FullAccessLock] OR [VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@WriteLock] OR [VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@ReadLock] OR [VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType]=[@NoDeleteLock]">
<Logical Operation="OR">
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@DeleteLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@FullAccessLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@WriteLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@ReadLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
<ScalarOperator>
<Compare CompareOp="EQ">
<ScalarOperator>
<Identifier>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Column="@NoDeleteLock" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
</Logical>
</ScalarOperator>
</Predicate>
</IndexScan>
</RelOp>
</Top>
</RelOp>
<ParameterList>
<ColumnReference Column="@ConflictLockType" ParameterCompiledValue="NULL" />
<ColumnReference Column="@ConflictTaskID" ParameterCompiledValue="NULL" />
<ColumnReference Column="@ObjectID" ParameterCompiledValue="{guid'A2F00759-D717-43EE-BFA8-1ED6FDD41AFC'}" />
</ParameterList>
</QueryPlan>
</StmtSimple>
<StmtSimple StatementText=" SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT " StatementId="33" StatementCompId="43" StatementType="ASSIGN" />
<StmtCond StatementText=" IF (@error = 0 AND @rowCount <> 0) " StatementId="34" StatementCompId="44" StatementType="COND">
<Condition />
<Then>
<Statements>
<StmtSimple StatementText=" BEGIN SET @error = @AcquireLockError " StatementId="35" StatementCompId="45" StatementType="ASSIGN" />
<StmtSimple StatementText=" GOTO ErrorRollback " StatementId="36" StatementCompId="46" StatementType="GOTO" />
</Statements>
</Then>
</StmtCond>
</Statements>
</Else>
</StmtCond>
</Statements>
</Else>
</StmtCond>
</Statements>
</Else>
</StmtCond>
<StmtSimple StatementText=" END END --Just insert specific row to acquire lock once above conditions are met INSERT INTO tbl_VMM_Lock ( ObjectID, ObjectType, TaskID, LockType ) VALUES ( @ObjectID, @ObjectType, @TaskID, @ReqLockType ) " StatementId="37" StatementCompId="51" StatementType="INSERT" StatementSubTreeCost="0.0100022" StatementEstRows="1" StatementOptmLevel="TRIVIAL" QueryHash="0x7EC55DCE2A83B127" QueryPlanHash="0x6F2FACF96C274DDF">
<StatementSetOptions QUOTED_IDENTIFIER="true" ARITHABORT="false" CONCAT_NULL_YIELDS_NULL="true" ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" NUMERIC_ROUNDABORT="false" />
<QueryPlan CachedPlanSize="16" CompileTime="0" CompileCPU="0" CompileMemory="264">
<RelOp NodeId="0" PhysicalOp="Clustered Index Insert" LogicalOp="Insert" EstimateRows="1" EstimateIO="0.01" EstimateCPU="1e-006" AvgRowSize="9" EstimatedTotalSubtreeCost="0.0100022" Parallel="0" EstimateRebinds="0" EstimateRewinds="0">
<OutputList />
<ScalarInsert>
<Object Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Index="[idx_VMM_Lock]" IndexKind="Clustered" />
<SetPredicate>
<ScalarOperator ScalarString="[VirtualManagerDB].[dbo].[tbl_VMM_Lock].[ObjectID] = RaiseIfNullInsert([@ObjectID]),[VirtualManagerDB].[dbo].[tbl_VMM_Lock].[ObjectType] = RaiseIfNullInsert([@ObjectType]),[VirtualManagerDB].[dbo].[tbl_VMM_Lock].[TaskID] = RaiseIfNullInsert([@TaskID]),[VirtualManagerDB].[dbo].[tbl_VMM_Lock].[LockType] = RaiseIfNullInsert([@ReqLockType])">
<ScalarExpressionList>
<ScalarOperator>
<MultipleAssign>
<Assign>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="ObjectID" />
<ScalarOperator>
<Intrinsic FunctionName="RaiseIfNullInsert">
<ScalarOperator>
<Identifier>
<ColumnReference Column="@ObjectID" />
</Identifier>
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
</Assign>
<Assign>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="ObjectType" />
<ScalarOperator>
<Intrinsic FunctionName="RaiseIfNullInsert">
<ScalarOperator>
<Identifier>
<ColumnReference Column="@ObjectType" />
</Identifier>
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
</Assign>
<Assign>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="TaskID" />
<ScalarOperator>
<Intrinsic FunctionName="RaiseIfNullInsert">
<ScalarOperator>
<Identifier>
<ColumnReference Column="@TaskID" />
</Identifier>
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
</Assign>
<Assign>
<ColumnReference Database="[VirtualManagerDB]" Schema="[dbo]" Table="[tbl_VMM_Lock]" Column="LockType" />
<ScalarOperator>
<Intrinsic FunctionName="RaiseIfNullInsert">
<ScalarOperator>
<Identifier>
<ColumnReference Column="@ReqLockType" />
</Identifier>
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
</Assign>
</MultipleAssign>
</ScalarOperator>
</ScalarExpressionList>
</ScalarOperator>
</SetPredicate>
</ScalarInsert>
</RelOp>
<ParameterList>
<ColumnReference Column="@ReqLockType" ParameterCompiledValue="(2)" />
<ColumnReference Column="@TaskID" ParameterCompiledValue="{guid'CA67DF04-1A45-4E08-8497-D2B959728EAE'}" />
<ColumnReference Column="@ObjectType" ParameterCompiledValue="N'VMHost'" />
<ColumnReference Column="@ObjectID" ParameterCompiledValue="{guid'B6EB3BC3-A176-4D71-96B3-DA131A74B2D0'}" />
</ParameterList>
</QueryPlan>
</StmtSimple>
<StmtSimple StatementText=" SET @error = @@ERROR " StatementId="38" StatementCompId="52" StatementType="ASSIGN" />
<StmtCond StatementText=" IF (@error <> 0) " StatementId="39" StatementCompId="53" StatementType="COND">
<Condition />
<Then>
<Statements>
<StmtSimple StatementText=" GOTO ErrorRollback " StatementId="40" StatementCompId="54" StatementType="GOTO" />
</Statements>
</Then>
</StmtCond>
<StmtSimple StatementText=" GOTO Success " StatementId="41" StatementCompId="56" StatementType="GOTO" />
<StmtSimple StatementText=" ErrorRollback: ROLLBACK TRAN @tranPoint " StatementId="42" StatementCompId="58" StatementType="ROLLBACK TRANSACTION" />
<StmtSimple StatementText=" Success: COMMIT TRAN " StatementId="43" StatementCompId="60" StatementType="COMMIT TRANSACTION" />
<StmtSimple StatementText=" SET NOCOUNT OFF " StatementId="44" StatementCompId="61" StatementType="SET ON/OFF" />
<StmtSimple StatementText=" SET TRANSACTION ISOLATION LEVEL READ COMMITTED " StatementId="45" StatementCompId="62" StatementType="SET TRANSACTION ISOLATION LEVEL" />
<StmtSimple StatementText=" RETURN @error " StatementId="46" StatementCompId="63" StatementType="RETURN" />
</Statements>
</Batch>
</BatchSequence>
</ShowPlanXML>
в аттаче прикладываю графический вариант.
Таблица tbl_VMM_Lock очень бегло модифицируется, то ни одной записи, то вот так вот может выглядеть
ObjectID ObjectType TaskID LockType
7BA119C6-BF40-4A03-A600-4E7BBC3C7218 ISO 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 3
75700CD5-893E-4F68-ADA7-50EF4668ACC6 UserRole 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 0
75700CD5-893E-4F68-ADA7-50EF4668ACC6 UserRole 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 0
65C03CD0-F184-4401-A985-59B1E6B13F6F VirtualNetworkAdapter 178DE1CD-0DB6-42BA-8926-02F1CC6D7668 3
A1428FEF-D74D-4AE8-B3F9-5A1A0088DF51 VirtualHardDisk 178DE1CD-0DB6-42BA-8926-02F1CC6D7668 3
33A1AF61-C54D-478C-A13B-5FDB53AA4DC8 VirtualSCSIAdapter 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 3
49023F95-6BED-4C2E-987B-6C2692E7CDEF VirtualDVDDrive 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 3
7AD2FD4A-42C8-493F-AE16-8BBAD52031EC VirtualDiskDrive 178DE1CD-0DB6-42BA-8926-02F1CC6D7668 3
5BFB3FFE-13BA-4B3F-8150-939CBB7D77AC VirtualDiskDrive 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 3
A34D2CE3-BE89-4B56-930D-A05AE18E6846 VirtualFloppyDrive 178DE1CD-0DB6-42BA-8926-02F1CC6D7668 3
E95238FF-7E40-4D68-8972-ABFE338E804D VirtualDVDDrive 178DE1CD-0DB6-42BA-8926-02F1CC6D7668 3
4851D710-D9DA-4437-A07A-B704071A49FC VMHost 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 0
4851D710-D9DA-4437-A07A-B704071A49FC VMHost 178DE1CD-0DB6-42BA-8926-02F1CC6D7668 0
AA90AEF0-C6E1-4D4F-9F87-BE343F3D062E VM 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 2
57E656F2-4305-4CF3-8BA8-C62BD58A3072 VirtualHardDisk 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 3
7F14F7EF-7292-4FC3-A748-C86387D7CE1B VirtualNetworkAdapter 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 3
9F75D5C9-CEBA-4820-9B9A-D87D712CE884 VM 178DE1CD-0DB6-42BA-8926-02F1CC6D7668 2
679220AD-2DC0-4B3F-B25A-ECC2A328783D VirtualFloppyDrive 31B10CDE-4AC5-4E5B-AF3E-8B967895F4A4 3

churupaha
автор
где крутятся базы VMM 2012


и еще вам бы схему не менять самим. это не ваша система? в техподдержке могут и отказать потом. выяснить причину и запостить им письмецо мол такая ситуация...

Структуры оригинальные из под VMM 2012 SP1 ROLLup 9(последнего). Всё я это конечно понимаю, но что делать если ничего не помогло(( ещё с Rollup 6 где писали что они победили все дедлоки ситуация ничуть не улучшилась.
5 июн 15, 11:01    [17734419]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
аттач забыл, сорри

К сообщению приложен файл (sqlplan.sqlplan - 52Kb) cкачать
5 июн 15, 11:02    [17734424]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
invm
Member

Откуда: Москва
Сообщений: 9721
У вас в рамках одной транзакции процедура prc_VMM_AcquireLock вызывается несколько раз с разными ObjectID. Причем в разных сессиях порядок вызова для одинаковых ObjecID - разный. Отсюда и дедлок.
5 июн 15, 14:32    [17736049]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
churupaha
Member

Откуда: Краснодар
Сообщений: 1015
invm
У вас в рамках одной транзакции процедура prc_VMM_AcquireLock вызывается несколько раз с разными ObjectID. Причем в разных сессиях порядок вызова для одинаковых ObjecID - разный. Отсюда и дедлок.


не похоже вроде.

в графе дедлока
 trancount="1" 


в процедуре

...
BEGIN TRAN
...
COMMIT TRAN
...


если бы несколько вызовов в пределах транзакции, было в графе дедлока

 trancount="Хотя бы 2" 
5 июн 15, 14:46    [17736137]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
invm
Member

Откуда: Москва
Сообщений: 9721
churupaha
не похоже вроде.
Да, виноват. Проглядел.
5 июн 15, 17:32    [17737214]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
stavgreengo
Member

Откуда:
Сообщений: 710
Maxx
stavgreengo,

ну и попробуйте все ваши иф - заменить 1 нот екзист по покрывавему условию ?
    SELECT TOP 1
        @ConflictTaskID = TaskID,
        @ConflictLockType = LockType
    FROM tbl_VMM_Lock WITH (UPDLOCK)
    WHERE ObjectID = @ObjectID
    AND   (LockType = @DeleteLock
    OR     LockType = @FullAccessLock
    OR     LockType = @WriteLock
    OR     LockType = @ReadLock
    OR     LockType = @NoDeleteLock)

    SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT
    IF (@error = 0 AND @rowCount <> 0)
    BEGIN
        SET @error = @AcquireLockError
        GOTO ErrorRollback
    END


Вас все равно интересует ситуация когда записи НЕТ....в любом другом случае вы ролбек делаете

попробовал заменить на следующий равнозначный этому код
IF EXISTS (
			SELECT TOP 1 TaskID
				,LockType
			FROM tbl_VMM_Lock WITH (UPDLOCK)
			WHERE ObjectID = @ObjectID
				AND (
					LockType = @DeleteLock
					OR LockType = @FullAccessLock
					OR LockType = @WriteLock
					OR LockType = @ReadLock
					OR LockType = @NoDeleteLock
					)
			)
	BEGIN
		SELECT TOP 1 @ConflictTaskID = TaskID
			,@ConflictLockType = LockType
		FROM tbl_VMM_Lock WITH (UPDLOCK)
		WHERE ObjectID = @ObjectID
			AND (
				LockType = @DeleteLock
				OR LockType = @FullAccessLock
				OR LockType = @WriteLock
				OR LockType = @ReadLock
				OR LockType = @NoDeleteLock
				)

		SET @error = @AcquireLockError

		GOTO ErrorRollback
	END

	SELECT @error = @@ERROR

	IF (@error = 0)
	BEGIN
		SET @error = @AcquireLockError

		GOTO ErrorRollback
	END

но с ним не работает, где ошибся, подскажите ?
25 июн 15, 14:35    [17815679]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
как мне кажеться :
1. Если есть запись в таблице tbl_VMM_Lock по @ObjectID - то уже блокировка есть и в екзисте вычитывать ее - нет смысла (если ,конечно,там не больше видов локов чем перечисленно выше)
2. переменная @AcquireLockError вообще нигде не используеться -зачем она нужна то фатку ?
3. секция после ифа с гоу ту вообще не выполянеться ,если сработал оператор безусловного перехода
4. @@ERROR -преверять поле присваения значений переменой и гоу ту - смысл? Он содержит код окончания ПОСЛЕДНЕЙ операции по стеку,ане вообще..
IF EXISTS (
			SELECT 1
			FROM tbl_VMM_Lock WITH (UPDLOCK)
			WHERE ObjectID = @ObjectID

			)
	BEGIN
		SELECT TOP 1 @ConflictTaskID = TaskID
			,@ConflictLockType = LockType
		FROM tbl_VMM_Lock WITH (UPDLOCK)
		WHERE ObjectID = @ObjectID
			AND (
				LockType = @DeleteLock
				OR LockType = @FullAccessLock
				OR LockType = @WriteLock
				OR LockType = @ReadLock
				OR LockType = @NoDeleteLock
				)

		--SET @error = @AcquireLockError

		GOTO ErrorRollback
	END
25 июн 15, 14:51    [17815791]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с deadlock  [new]
invm
Member

Откуда: Москва
Сообщений: 9721
stavgreengo
подскажите ?
Все это безобразие в процедуре можно упростить до:
SELECT TOP 1 
 @ConflictTaskID = TaskID,
 @ConflictLockType = LockType
FROM tbl_VMM_Lock WITH (UPDLOCK)
WHERE
 ObjectID = @ObjectID AND
 case
  when @ReqLockType = @NoDeleteLock and LockType in (@DeleteLock, @FullAccessLock) then 1
  when @ReqLockType = @ReadLock and LockType in (@DeleteLock, @FullAccessLock, @WriteLock) then 1
  when @ReqLockType = @WriteLock and LockType in (@DeleteLock, @FullAccessLock, @WriteLock, @ReadLock) then 1
  when LockType in (@DeleteLock, @FullAccessLock, @WriteLock, @ReadLock, @NoDeleteLock) then 1
 end = 1

SELECT @error = @@ERROR, @rowCount = @@ROWCOUNT
IF (@error = 0 AND @rowCount <> 0)
BEGIN
   SET @error = @AcquireLockError
   GOTO ErrorRollback
END
25 июн 15, 22:13    [17817616]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Помогите разобраться с deadlock  [new]
Взаимоблокировка VMM
Guest
Добрый день!
Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)

Точно такая же взаимоблокировка.
У кого-нибудь получилось решить проблему?
11 окт 16, 14:00    [19768979]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить