SQL Server тупик на непересекающихся множествах - PullRequest
1 голос
/ 23 марта 2012

У меня есть следующие отношения

Ключевое слово (1) <---> (n) K2I (n) <---> (1) Клип (n) <---> (1)Медиа

А именно, у нас есть набор ключевых слов и набор клипов.Любые ключевые слова могут быть связаны с любыми клипами.На одном носителе может быть определено несколько клипов.

Я неоднократно тупил со следующим графиком:

deadlock-list
 deadlock victim=process8ba4d8
  process-list
   process id=process8ba4d8 taskpriority=0 logused=2120 waitresource=KEY: 6:72057600639696896 (37001eba95c6) waittime=7593 ownerId=2999710658 transactionname=user_transaction lasttranstarted=2012-03-23T10:13:29.140 XDES=0x2e2395e8 lockMode=U schedulerid=1 kpid=5268 status=suspended spid=295 sbid=0 ecid=0 priority=0 transcount=2 lastbatchstarted=2012-03-23T10:13:29.857 lastbatchcompleted=2012-03-23T10:13:29.857 hostpid=2648 loginname=EVS isolationlevel=read committed (2) xactid=2999710658 currentdb=6 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
    executionStack
     frame procname=adhoc line=1 sqlhandle=0x0200000037de5708dce42f56ca1fb49fb2f34ac7f1b17d21
DELETE FROM [KeyWordsToItem] 
WHERE IdItemType = 2 AND
      IdItem IN ( 
         SELECT Id FROM [Clip]
         WHERE IdMedia = 8904 AND LSM_LouthID NOT IN ('#NCnuyFG') )     
    inputbuf
DELETE FROM [KeyWordsToItem] 
WHERE IdItemType = 2 AND
      IdItem IN ( 
         SELECT Id FROM [Clip]
         WHERE IdMedia = 8904 AND LSM_LouthID NOT IN ('#NCnuyFG') )    
   process id=processbf5018 taskpriority=0 logused=6884 waitresource=KEY: 6:72057600638255104 (810048eb4170) waittime=5000 ownerId=2999709276 transactionname=user_transaction lasttranstarted=2012-03-23T10:13:28.640 XDES=0x26f505e0 lockMode=S schedulerid=4 kpid=2488 status=suspended spid=293 sbid=0 ecid=0 priority=0 transcount=2 lastbatchstarted=2012-03-23T10:13:29.687 lastbatchcompleted=2012-03-23T10:13:29.687 hostpid=3516 loginname=EVS isolationlevel=read committed (2) xactid=2999709276 currentdb=6 lockTimeout=4294967295 clientoption1=671088672 clientoption2=128056
    executionStack
     frame procname=adhoc line=1 sqlhandle=0x020000004ccefe1488b29fbb71c97825ce7c74e9e683fd2c
DELETE FROM [KeyWordsToItem] 
WHERE IdItemType = 2 AND
      IdItem IN ( 
         SELECT Id FROM [Clip]
         WHERE IdMedia = 8905 AND LSM_LouthID NOT IN ('#NBIZhap') )     
    inputbuf
DELETE FROM [KeyWordsToItem] 
WHERE IdItemType = 2 AND
      IdItem IN (
         SELECT Id FROM [Clip]
         WHERE IdMedia = 8905 AND LSM_LouthID NOT IN ('#NBIZhap') )    
  resource-list
   keylock hobtid=72057600639696896 dbid=6 objectname=CleanEditDB.dbo.KeyWordsToItem indexname=PK_KeyWordsToItem id=lock2d9e3680 mode=U associatedObjectId=72057600639696896
    owner-list
     owner id=processbf5018 mode=U
    waiter-list
     waiter id=process8ba4d8 mode=U requestType=wait
   keylock hobtid=72057600638255104 dbid=6 objectname=CleanEditDB.dbo.Clip indexname=IX_Clip id=lock78200640 mode=X associatedObjectId=72057600638255104
    owner-list
     owner id=process8ba4d8 mode=X
    waiter-list
     waiter id=processbf5018 mode=S requestType=wait

Насколько я понимаю, эти 2 транзакции работают с двумя непересекающимися наборами данных.*

Так почему тупик?Это потому, что сервер берет блокировки страниц за сценой?

Как я могу предотвратить их появление?

Спасибо за вашу помощь!

Вот определение таблиц и индексов:

CREATE TABLE [dbo].[KeyWordsToItem](
    [IdKeyWord] [dbo].[identifier] NOT NULL,
    [IdItem] [dbo].[identifier] NOT NULL,
    [IdItemType] [dbo].[identifier] NOT NULL,
    [PosIndex] [tinyint] NOT NULL,
 CONSTRAINT [PK_KeyWordsToItem] PRIMARY KEY CLUSTERED 
(
    [IdItemType] ASC,
    [IdItem] ASC,
    [IdKeyWord] ASC,
    [PosIndex] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IX_KeyWordsToItem_KeyWord] ON [dbo].[KeyWordsToItem] 
(
    [IdKeyWord] 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

CREATE TABLE [dbo].[KeyWords](
    [Id] [dbo].[identifier] IDENTITY(1,1) NOT NULL,
    [Keyword] [nvarchar](64) NOT NULL,
 CONSTRAINT [PK_KeyWords] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Clip](
    [Id] [dbo].[identifier] IDENTITY(1,1) NOT NULL,
    [IdMedia] [dbo].[identifier] NOT NULL,
    [TcInMedia] [dbo].[fields] NOT NULL,
    [Label] [nvarchar](256) NOT NULL,
    [Duration] [dbo].[fields] NOT NULL,
 CONSTRAINT [PK_Clip] PRIMARY KEY NONCLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IX_Clip_IdMedia] ON [dbo].[Clip] 
(
    [IdMedia] 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, FILLFACTOR = 90) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Media](
    [Id] [dbo].[identifier] IDENTITY(1,1) NOT NULL,
    [IdMediaFileLow] [dbo].[identifier] NULL,
    [IdMediaFileHigh] [dbo].[identifier] NULL,
    [Label] [nvarchar](256) NOT NULL,
    [LSM_LouthID] [nchar](8) NULL,
    [Version] [timestamp] NOT NULL,
 CONSTRAINT [PK_Media] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [IX_Media_IdMediaFileHigh] ON [dbo].[Media] 
(
    [IdMediaFileHigh] 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, FILLFACTOR = 90) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_Media_IdMediaFileLow] ON [dbo].[Media] 
(
    [IdMediaFileLow] 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, FILLFACTOR = 90) ON [PRIMARY]
GO

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Два непересекающихся набора могут оставаться в тупике из-за коллизии хэшей, см. %% LOCKRES %% Магический маркер вероятности столкновения: 16,777,215

Однако ваш тупик не такой случай. В тупике задействована таблица CleanEditDB.dbo.Clip, которая нигде не встречается в операторах, но одна транзакция имеет S-блокировку, а другой транзакции требуется X-блокировка. Это наводит меня на мысль, что здесь задействован внешний ключ каскадного удаления или другой аналогичный механизм «внеполосного управления». Вам нужно будет опубликовать точное определение задействованных объектов, включая все индексы и все внешние ключи.

1 голос
/ 02 апреля 2012

У вас нет Кластерного Ключа на вашей таблице [Клип].Сделать первичный ключ ([Id]) кластеризованным.

Кроме того, что-то не так с вашими определениями в таблице.График взаимоблокировки, кажется, думает, что вы запрашиваете столбец LSM_LouthID в своей таблице [Clip], но вы только перечисляете этот столбец в своей таблице [Media].такой столбец в [Clip], затем добавьте некластеризованный индекс к столбцам таблицы [clip] (IdMedia, LSM_LouthId).

Я считаю, что эти изменения должны устранить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...