Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Какую я только что весчь поймал!  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Создаем таблицу.

-- drop table a
create table a ( id int primary key nonclustered , flag int , name varchar(80) )
create clustered index ia on a ( flag )
create index ian on a ( name )

Заполняем данными. Немного!

insert into a ( id , flag , name ) select top 1000 id, id , name from sysobjects

Дальше в первом окошке запускаем:

set nocount on

l1:

update a set flag =  2147354935  - flag
-- update a set flag =  2147354935  - flag
-- waitfor delay '00:00:01.1'

raiserror( '1', 0, 1 ) with nowait

goto l1

А во втором пробуем:

select top 128 * from a with (nolock) order by name

И через раз получаем

Server: Msg 601, Level 12, State 3, Line 1
Could not continue scan with NOLOCK due to data movement.

Прикидываемся кр00тыми гуру и убираем NOLOCK , попадая на ...

Server: Msg 1205, Level 13, State 1, Line 1
Transaction (Process ID 82) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

Который уходит только при использовании TABLOCK хинта! Кто не верит - проверяйте сами. Клиенты заявили такую багу с чистого SP3a. У меня воспроизводится на Build 929. Попробую заявить как багу... Но для начала подожду "помощи из зала"!
5 окт 04, 13:58    [1009424]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Crimean
Member

Откуда:
Сообщений: 13148
http://support.microsoft.com/default.aspx?scid=kb;en-us;815008

Немного проясняет ситуацию. Указанным трасфлагом пока пользоваться не хотю - страшна. Да и природа дедлоков не сильно понятна.
5 окт 04, 14:02    [1009457]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Выполнено. Все прошло на ура на версии:

Microsoft SQL Server  2000 - 8.00.760 (Intel X86)   Dec 17 2002 14:22:05   Copyright (c) 1988-2003 Microsoft Corporation  Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 4) 
5 окт 04, 14:06    [1009479]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Вдогонку - 760-й билд это SP3
5 окт 04, 14:08    [1009489]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
YellowMan
Member

Откуда: острова
Сообщений: 1047
У меня на версии 8.00.760 все в точности как описано. Забавно, будем ковыряться
5 окт 04, 14:11    [1009509]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Возможно, не факт, но возможно, что проявляется только если процев больше одного. Хотя в планах нет паралелизма. Ну и не всегда проявляется при первом запуске. Надо выборки подергать несколько раз на фоне обновления.
5 окт 04, 14:12    [1009515]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Местами даже вот так получается:

id          flag        name                                                                             
----------- ----------- -------------------------------------------------------------------------------- 
   73154335  2074200600 AgreePatterns
  115960681  2031394254 aks_CheckLimit
  131960738  2015394197 aks_LimitTransfers
  147960795  1999394140 aks_PrepareLimits
  163960852  1983394083 aks_PrepareQueries

Server: Msg 1205, Level 13, State 1, Line 1
Transaction (Process ID 82) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

То есть дедлок получается между отбором строк по некластерному индексу и букмарком по кластерному, который меняется в соседней сессии. Аналогично и 601 ошибка пролазит.
5 окт 04, 14:14    [1009523]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Угу, на машине 1 камень.
5 окт 04, 14:15    [1009531]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Прогнал раз 20, прежде чем написать, что все ОК
5 окт 04, 14:16    [1009535]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Трасфлаг из KB не помогает. И 601 и Deadlock лезут аж бегом. option( maxdop 1 ) не помогает - все аналогично.
Help!..
5 окт 04, 14:18    [1009550]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
На машине 4 камня, бага появляется с завидным постоянством.
Microsoft SQL Server 2000 - 8.00.194 (Intel X86) Aug 6 2000 00:57:48 Copyright (c) 1988-2000 Microsoft Corporation Enterprise Edition on Windows NT 5.0 (Build 2195: Service Pack 3)
5 окт 04, 14:22    [1009567]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
guest00x
Guest
Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: )

Все аналогично описанному.

Два процессора.
5 окт 04, 14:24    [1009573]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Crimean
Member

Откуда:
Сообщений: 13148
На билдах от 760 до 929 проявляется точно.
Судя по всему бага еще от 7.0
И судя по всему причина кроется в реализации букмарков в оптимизаторе :(
5 окт 04, 14:27    [1009593]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
YellowMan
Member

Откуда: острова
Сообщений: 1047
С природой дедлока как раз таки все более-менее понятно. Ты вклиниваешься селектом между RangeI_N и до собственно вставки значения (Х лок) - вот и получается что селект S лок положил а прочесть из-за RangeI_N не может, а апдейт RangeI_N положил а Х положить не может из-за S. Ну и соответственно селект отстреливается как малозначащий.
5 окт 04, 14:30    [1009607]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Trong
Member

Откуда: Novosibirsk
Сообщений: 759
Microsoft SQL Server 2000 - 8.00.194 - это вообще без сервиспака. Так что чистый SQL 2000 этому подвержен 100%
5 окт 04, 14:33    [1009621]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
YellowMan
Member

Откуда: острова
Сообщений: 1047
Crimean
Трасфлаг из KB не помогает. И 601 и Deadlock лезут аж бегом. option( maxdop 1 ) не помогает - все аналогично.
Help!..


Старый добрый способ - меняй логику в этом месте
5 окт 04, 14:33    [1009623]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Гм. Насчет понятности дедлока я бы поспорил... Есть ЧИСТЫЙ update в одной сессии и чистый SELECT в другой. Хоть убей, но НЕ ДОЛЖНЫ они дедлочить. НУ НИКАК!
А если лечится это только через TABLOCK (а я другого способа пока еще не нашел) , то ...
5 окт 04, 14:35    [1009632]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
YellowMan
Member

Откуда: острова
Сообщений: 1047
Погодь, а ты hotfix поставил ? Там же вроде надо в поддержку звонить и у них просить - скачать неоткуда. Неужели они так быстро прислали ?
5 окт 04, 14:37    [1009640]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Crimean
Member

Откуда:
Сообщений: 13148
У мя щаз

Microsoft SQL Server 2000 - 8.00.929 (Intel X86)
5 окт 04, 14:38    [1009643]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Crimean
Member

Откуда:
Сообщений: 13148
И, кстати, дедлок или 601 ошибка ПОСРЕДИНЕ резалтсета это круто. Хотя, возможно, все и пройдет, если вообще снести кластерный индекс... Но это основательно просадит выборки...
5 окт 04, 14:39    [1009649]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Glory
Member

Откуда:
Сообщений: 104764
Crimean
Гм. Насчет понятности дедлока я бы поспорил... Есть ЧИСТЫЙ update в одной сессии и чистый SELECT в другой. Хоть убей, но НЕ ДОЛЖНЫ они дедлочить. НУ НИКАК!
А если лечится это только через TABLOCK (а я другого способа пока еще не нашел) , то ...

Это лечиться еще так например
select top 128 name from a order by name
5 окт 04, 14:42    [1009663]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
YellowMan
Member

Откуда: острова
Сообщений: 1047
так ты поставил фикс или нет ?
Я так думаю что если кластерный и не кластерный махнуть местами выборки не особо просядут а проблема уйдет.
5 окт 04, 14:42    [1009665]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
YellowMan
Member

Откуда: острова
Сообщений: 1047
Glory
Это лечиться еще так например
select top 128 name from a order by name


Конечно - тут же букмарка не будет. Кстати, еще одна идея - сделать индекс по имени covered - ну не знаю я как это по русски написать
5 окт 04, 14:44    [1009672]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Glory
Member

Откуда:
Сообщений: 104764
Или так
select top 128 * from a with(index=0)order by name
5 окт 04, 14:44    [1009673]     Ответить | Цитировать Сообщить модератору
 Re: Какую я только что весчь поймал!  [new]
Crimean
Member

Откуда:
Сообщений: 13148
2 Glory

Ну, оно да, уберем букмарки и все будет ок. Это уже понятно, что виной всему несогласованность букмарков со всей операцией чтения.

2 ALL

Ну ладно. "Help" анулируется :) 100-200 строк кода в одном месте и ошибка станет маловероятной. Но. Она проявляется и при

update a set flag = flag

то есть даже при НАМЕРЕНИИ изменения кластерного индекса. Я понимаю, что смена кластерного индекса есть бяка. Но иногда-то надо... Даже в таблице, на основе которой построено секционированное представление и этот индекс является и ПК и критерием секционирования и ... Ну, тут "сам дурак", но систему уже не переписать :)
Возможно, придется просто на 100% отказаться от смены кластерного индекса. Через DELETE / INSERT или через введение технического поля в уникальность... Все равно таблицу под вьюхой прятать.

Но сам по себе дедлок очень пугает!
5 окт 04, 14:47    [1009683]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить