powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите понять информацию по блокировке..
55 сообщений из 55, показаны все 3 страниц
Помогите понять информацию по блокировке..
    #39725879
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Версия сервера:

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )


Словили блокировку с типом "KEY" (Блокировка внутри индекса, которая защищает диапазон ключей в сериализуемых транзакциях)
Режим блокировки "U" (Update)

Знаем объект который участвует в блокировке - это таблица с "кубами"
Содержимое INPUTBUFFER показало, что ноги растут из хранимой процедуры (назовем её " MyDB.dbo.DeleteCheckedItems;1 ")

Поясните, куда копать? Что то не так с индексами у этой таблицы? или с ключом?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725887
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с чего вы вообще взяли, что в вашей ситуации что-то не так?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725906
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERСловили блокировку с типом "KEY" (Блокировка внутри индекса, которая защищает диапазон ключей в сериализуемых транзакциях)
Режим блокировки "U" (Update)Вы про блокировку, или про дедлок?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725908
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич,

Ну потому что я словил блокировку. Эта блокировка может висеть часами, у пользователей всё начинает тормозить. До тех пор пока её не прибьют руками.
Хочу, чтобы таких блокировок не возникало.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725909
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgMAULERСловили блокировку с типом "KEY" (Блокировка внутри индекса, которая защищает диапазон ключей в сериализуемых транзакциях)
Режим блокировки "U" (Update)Вы про блокировку, или про дедлок?

Видимо дедлок. Хочу понять причину, а из информации что есть только то что я написал в первом посте.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725913
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERВидимо дедлок
видимо, что угодно, но не дедлок.
дедлок сервер разруливает без вас менее, чем за секунду
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725917
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

Я просто хочу понять, почему именно блокировка с типом KEY?
Т.е. что мне проверить в первую очередь? Может быть что-то не так с индексом? или индекс построен неправильно.. или ещё что-то?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725924
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123дедлок сервер разруливает без вас менее, чем за секунду

первый дедлок будет разрешен максимум через 5 секунд после возникновения
далее частота обнаружения резко повышается (до 100ms), если дедлоков больше не наблюдается, частота возвращается к 5 с
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725927
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERYasha123,

Я просто хочу понять, почему именно блокировка с типом KEY?
Т.е. что мне проверить в первую очередь? Может быть что-то не так с индексом? или индекс построен неправильно.. или ещё что-то?
и с чем же еще должна быть блокировка?
радуйтесь, что KEY, индекс используется.
вам бы хотелось, чтобы всю таблицу залочило?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725929
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERНу потому что я словил блокировку. Эта блокировка может висеть часами, у пользователей всё начинает тормозить. До тех пор пока её не прибьют руками.
Хочу, чтобы таких блокировок не возникало.

либо активный процесс (владелец блокировки) не очень расторопен, либо незакрытая транзакция

воспользуйтесь sp_whoisactive - она покажет и блокирующего, и транзакции, и планы, и многое другое
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725930
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komradYasha123дедлок сервер разруливает без вас менее, чем за секунду
первый дедлок будет разрешен максимум через 5 секунд после возникновения
далее частота обнаружения резко повышается (до 100ms), если дедлоков больше не наблюдается, частота возвращается к 5 с
и какая же разница, если у ТС
авторЭта блокировка может висеть часами
?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725932
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERЗдравствуйте.

Версия сервера:

Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) Apr 2 2010 15:48:46 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )

Поясните, куда копать?
поставьте актуальный апдейт сначала, а то можно удивляться багам на ровном месте

http://sqlserverbuilds.blogspot.com/#sql2008r2
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725935
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123komradпропущено...

первый дедлок будет разрешен максимум через 5 секунд после возникновения
далее частота обнаружения резко повышается (до 100ms), если дедлоков больше не наблюдается, частота возвращается к 5 с
и какая же разница, если у ТС
авторЭта блокировка может висеть часами
?
это к тому, что не 1с, а 5с для первого дедлока
просто уточнение
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725949
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERСловили блокировку с типом "KEY" (Блокировка внутри индекса, которая защищает диапазон ключей в сериализуемых транзакциях)
Режим блокировки "U" (Update)

и где вы тут нашли "диапазон ключей" и "сериализацию"?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725953
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123, здесь .
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39725974
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERYasha123, здесь .
значит, смените чтиво.
вот тут перечислены блокировки,
сравните таблицы 10-3 и 10-4,
убедитесь, что у вас никакого диапазона нет,
равно как и сериализации
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726310
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123,

Спасибо. Чтиво полезное.
Но у меня до сих пор нет полной ясности, что делать с этой блокировкой.

Посмотрел код хранимой процедуры, там идет блок try-catch:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
	  begin try	  
			set @rowCountExt = 1;
			while @rowCountExt > 0
			begin
				begin transaction
					begin
						exec('DELETE TOP(10) FROM [' + @name + '] WHERE [deleted] = 1');
					end				
					set @rowCountExt = @@rowcount;
				commit transaction
			end			
	  end try		
	  begin catch	  
			rollback transaction;
			SELECT 
				@ErrorMessage = ERROR_MESSAGE(),
				@ErrorSeverity = ERROR_SEVERITY(),
				@ErrorState = ERROR_STATE();
			RAISERROR (@ErrorMessage,@ErrorSeverity,@ErrorState);
			return;
	  end catch



вот этот
Код: sql
1.
exec('DELETE TOP(10) FROM [' + @name + '] WHERE [deleted] = 1');


обрабатывает 0 строк, т.к. в столбце [deleted] везде нули.

может чей то опытный взгляд заметит подводный камень в этом коде?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726329
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERможет чей то опытный взгляд заметит подводный камень в этом коде?Подозреваю, что для удаления нужно долго сканить всю таблицу, предварительно её заблокировав.

Рекомендую сделать фильтрованный индекс с условием WHERE [deleted] = 1
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726348
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,
Я посмотрел содержимое, В этой таблице, 8500 записей. Неужели такое количество может положить сервер на несколько часов?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726371
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

Ваша сессия с DELETE тоже блокирована.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726382
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Да, а видимо кем блокирована, надо посмотреть по blocked, выкупить запрос из INPUTBUFFER по spid = blocked
и понять корень блокировки...

У меня правильный ход мыслей?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726408
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERи понять корень блокировки...

У меня правильный ход мыслей?Да
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726563
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, правильно ли я понимаю процесс отлавливания причины блокировки:
Первоначально процесс построен так:

1) Отлавливаю блокировку:
Код: sql
1.
2.
3.
SELECT *
  FROM master.dbo.sysprocesses (nolock) 
 WHERE blocked > 0


Получаю 1 строку с информацией о блокировке. (т.е. @spid = spid и @blocked = blocked)

Получаю текст заблокированного запроса:
Код: sql
1.
2.
3.
4.
declare @eventInfo nvarchar(max)
SELECT @eventInfo = (select t.text from sys.[dm_exec_sql_text](sp.sql_handle) t)		   
  FROM master.dbo.sysprocesses (nolock) sp
WHERE spid = @spid



Затем получаю текст блокирующего запроса:
Код: sql
1.
2.
3.
4.
declare @blocked_eventInfo nvarchar(max)
SELECT @blocked_eventInfo = (select t.text from sys.[dm_exec_sql_text](sp.sql_handle) t)		   
  FROM master.dbo.sysprocesses (nolock) sp
 WHERE spid = @blocked



Проблема в том, что если смотреть процесс в dbo.sysprocesses по spid = @blocked (из первого запроса)
то он (как я понимаю первопричина) - не заблокирован.
и INPUTBUFFER такого процесса постоянно меняется! Отсюда у меня есть опасения, что я не правильно получаю текст блокирующего запроса.

Отсюда вопрос: как получить текст того самого первого запроса, который стал причиной блокировки?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726605
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, что причина, по которой каждый раз меняется текст блокирующего запроса - простая:

Я ловлю блокировку агентом MSSQL, задание которого срабатывает каждые 30 сек.
На момент возникновения блокировки spid и blocked попадают в sysprocesses абсолютно верными.

Но когда начинаю анализировать блокировку (предварительно поймав её), spid блокировки остаётся прежним, ведь она ещё висит!

а вот blocked (id блокирующего процесса) может уже 20 раз измениться. И вроде бы я смотрю правильный spid в sysprocesses , а данные в нём уже совсем от другой активности.

Поэтому смысл смотреть содержимое INPUTBUFFER блокирующего процесса имеет только тогда, когда есть возможность перехватывать его сразу в момент возникновения, а не по таймеру.

Я правильно понимаю суть?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726643
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

если блокировка исчезает за столь малое время (несколько секунд), то проблема, скорее всего, недостойна внимания.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726699
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERНо когда начинаю анализировать блокировку (предварительно поймав её), spid блокировки остаётся прежним, ведь она ещё висит!

а вот blocked (id блокирующего процесса) может уже 20 раз измениться. И вроде бы я смотрю правильный spid в sysprocesses , а данные в нём уже совсем от другой активности.А, понятно.
У вас в джобе регулярно выполняется некое удаление. Разумеется, оно часто блокируется, как же иначе? Но блокируется на короткое время, что не является проблемрой, а специально так задумано, во имя обеспечения целостности и атомарности БД.

Просто у вас неправильный скрипт выявления блокировок. Нужно выявлять длительные блокировки, это действительно тревожный признак (хотя иногда это неизбежно), а не короткие.

Я то думал, что у вас висят процессы, всё заблокировано надолго, а в итоге оказался прав Гавриленко Сергей Алексеевич :-)Гавриленко Сергей АлексеевичА с чего вы вообще взяли, что в вашей ситуации что-то не так?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726701
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Блокировка не исчезает, а может висеть сколь угодно долго.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726705
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgMAULERНо когда начинаю анализировать блокировку (предварительно поймав её), spid блокировки остаётся прежним, ведь она ещё висит!

а вот blocked (id блокирующего процесса) может уже 20 раз измениться. И вроде бы я смотрю правильный spid в sysprocesses , а данные в нём уже совсем от другой активности.А, понятно.
У вас в джобе регулярно выполняется некое удаление. Разумеется, оно часто блокируется, как же иначе? Но блокируется на короткое время, что не является проблемрой, а специально так задумано, во имя обеспечения целостности и атомарности БД.

Просто у вас неправильный скрипт выявления блокировок. Нужно выявлять длительные блокировки, это действительно тревожный признак (хотя иногда это неизбежно), а не короткие.

Я то думал, что у вас висят процессы, всё заблокировано надолго, а в итоге оказался прав Гавриленко Сергей Алексеевич :-)Гавриленко Сергей АлексеевичА с чего вы вообще взяли, что в вашей ситуации что-то не так?

Так мой скрипт, и выявляет длительную блокировку, как раз она может висеть очень долго. Просто у блокировки, среди прочих полей, есть два поля: spid и blocked. Значения у них разные.

Разработчики запросили код не блокируемой транзакции (spid) а блокирующей (я так понимаю, что это blocked?!)
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726744
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERТак мой скрипт, и выявляет длительную блокировку, как раз она может висеть очень долго. Просто у блокировки, среди прочих полей, есть два поля: spid и blocked. Значения у них разные.Вы же пишите, что "а вот blocked (id блокирующего процесса) может уже 20 раз измениться"

С чего же вы взяли, что она длительная?
Этот блокируемый процесс тыщу раз заблокировали-отпустили, пока вы смотрели.

Длительная - это когда как минимум spid и blocked не меняются, причём даже это не гарантирует, потому что в промежутке они могли разблокироваться, поработать, и снова заблокироваться. Нужно смотреть где то в sys.dm_tran_locks
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726752
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Абсолютно точно spid не меняется. Запись висит в блокировках в мониторе и в

Код: sql
1.
2.
SELECT * from [master].[dbo].[sysprocesses]
WHERE blocked > 0



с одним и тем же spid-ом.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726753
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в sys.dm_tran_locks
висит та же самая с тем же spid что и в sysprocesses
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726754
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

какая-то путаница в показаниях... А это о чем Вы написали?
Проблема в том, что если смотреть процесс в dbo.sysprocesses по spid = @blocked (из первого запроса)
то он (как я понимаю первопричина) - не заблокирован.
и INPUTBUFFER такого процесса постоянно меняется!

то меняется, то не меняется.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726763
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Ну а как я найду содержимое INPUTBUFFER зная blocked?! (т.е. блокирующего процесса)

Я зайду в sysprocesses и найду там запись с spid = blocked (из первой записи)
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726764
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потом этот spid подставлю в DBCC INPUTBUFFER и получу запрос который был причиной блокировки. spid которого потом попал в blocked заблокированного процесса.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726765
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERПроблема в том, что если смотреть процесс в dbo.sysprocesses по spid = @blocked (из первого запроса)
то он (как я понимаю первопричина) - не заблокирован.
и INPUTBUFFER такого процесса постоянно меняется!Вполне вероятно, что в блокирующей сессии есть незакрытая или долгоиграющая транзакция.
Проверить это можно так
Код: sql
1.
select * from sys.dm_tran_session_transactions where session_id = @blocking_session_id;
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726767
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmMAULERПроблема в том, что если смотреть процесс в dbo.sysprocesses по spid = @blocked (из первого запроса)
то он (как я понимаю первопричина) - не заблокирован.
и INPUTBUFFER такого процесса постоянно меняется!Вполне вероятно, что в блокирующей сессии есть незакрытая или долгоиграющая транзакция.
Проверить это можно так
Код: sql
1.
select * from sys.dm_tran_session_transactions where session_id = @blocking_session_id;



Вот очень на это похоже!!
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726768
архивариус
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
USE master;

select
t1.resource_type as [lock type]
,db_name(resource_database_id) as [database]
,t1.resource_associated_entity_id as [blk object]
,t1.request_mode as [lock req] -- lock requested
,t1.request_session_id as [waiter sid] -- spid of waiter
,t2.wait_duration_ms as [wait time]
,(select text from sys.dm_exec_requests as r --- get sql for waiter
cross apply sys.dm_exec_sql_text(r.sql_handle)
where r.session_id = t1.request_session_id) as waiter_batch
,(select substring(qt.text,r.statement_start_offset/2,
(case when r.statement_end_offset = -1
then len(convert(nvarchar(max), qt.text)) * 2
else r.statement_end_offset end - r.statement_start_offset)/2)
from sys.dm_exec_requests as r
cross apply sys.dm_exec_sql_text(r.sql_handle) as qt
where r.session_id = t1.request_session_id) as waiter_stmt --- this is the statement executing right now
,t2.blocking_session_id as [blocker sid] -- spid of blocker
,(select text from sys.sysprocesses as p --- get sql for blocker
cross apply sys.dm_exec_sql_text(p.sql_handle)
where p.spid = t2.blocking_session_id) as blocker_stmt
from
sys.dm_tran_locks as t1,
sys.dm_os_waiting_tasks as t2
where
t1.lock_owner_address = t2.resource_address;
GO



может поможет чем
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726772
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
архивариусMAULER,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
USE master;

select
t1.resource_type as [lock type]
,db_name(resource_database_id) as [database]
,t1.resource_associated_entity_id as [blk object]
,t1.request_mode as [lock req] -- lock requested
,t1.request_session_id as [waiter sid] -- spid of waiter
,t2.wait_duration_ms as [wait time]
,(select text from sys.dm_exec_requests as r --- get sql for waiter
cross apply sys.dm_exec_sql_text(r.sql_handle)
where r.session_id = t1.request_session_id) as waiter_batch
,(select substring(qt.text,r.statement_start_offset/2,
(case when r.statement_end_offset = -1
then len(convert(nvarchar(max), qt.text)) * 2
else r.statement_end_offset end - r.statement_start_offset)/2)
from sys.dm_exec_requests as r
cross apply sys.dm_exec_sql_text(r.sql_handle) as qt
where r.session_id = t1.request_session_id) as waiter_stmt --- this is the statement executing right now
,t2.blocking_session_id as [blocker sid] -- spid of blocker
,(select text from sys.sysprocesses as p --- get sql for blocker
cross apply sys.dm_exec_sql_text(p.sql_handle)
where p.spid = t2.blocking_session_id) as blocker_stmt
from
sys.dm_tran_locks as t1,
sys.dm_os_waiting_tasks as t2
where
t1.lock_owner_address = t2.resource_address;
GO



может поможет чем

Благодарю. Завтра отпишусь!
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726787
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULER,

Я себе такое представление сделал, иногда использую. Понятно, что там виден текст пакета, а не Inputbuffer, но этого должно быть достаточно. Представление вычисляет самый верхний блокирующий процесс в цепочке.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
CREATE VIEW dbo.ViewBlocks
AS
WITH tbl1
	 AS (SELECT t1.spid,
				t1.blocked,
				SQLtext.text
		 FROM [master].sys.sysprocesses t1
		 CROSS APPLY sys.dm_exec_sql_text(t1.sql_handle) SQLtext
		),
	 tbl2
	 AS (
	 SELECT tbl1.spid,
			tbl1.blocked,
			tbl1.spid head_session_id,
			tbl1.text
	 FROM tbl1 tbl1
	 WHERE tbl1.blocked = 0
	 UNION ALL
	 SELECT tbl1.spid,
			tbl1.blocked,
			tbl2.head_session_id,
			tbl1.text
	 FROM tbl1 tbl1
	 INNER JOIN tbl2 ON tbl2.spid = tbl1.blocked)
	 SELECT tbl2.spid,
			tbl2.blocked,
			case WHEN tbl2.head_session_id = tbl2.spid then 0 else tbl2.head_session_id END head_session_id,
			tbl2.text
	 FROM tbl2 tbl2;
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726940
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброе утро.

Выловил баг в хранимой процедуре, использующей внутри себя курсор.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DECLARE deleteCursor CURSOR FAST_FORWARD FOR 
 select name from @tblList order by level, name

  OPEN deleteCursor

 FETCH NEXT FROM deleteCursor 
  INTO @name

WHILE @@FETCH_STATUS = 0
BEGIN

....
....


В блоке try-catch происходит:
1) "Конфликт инструкции DELETE с ограничением REFERENCE"
2) по ветке catch происходит генерация RAISEERROR...
3) и return

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
....
....

    FETCH NEXT FROM deleteCursor 
	INTO @name
	
END 

CLOSE deleteCursor
DEALLOCATE deleteCursor



т.е. освобождения курсора не происходит.
При попытке запустить второй раз ту же самую ХП, MSSQL ругается на то что такой курсор уже существует, дорабатывает оставшийся набор записей, и впадает в мертвый цикл...

Я так понимаю, что что-то происходит с переменной @@FETCH_STATUS, которая всегда = 0...
Или я неправильно понимаю ситуацию?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726950
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERЯ так понимаю, что что-то происходит с переменной @@FETCH_STATUS, которая всегда = 0...В документации указано, что @@FETCH_STATUS в таком случае неопределён. Может, это и 0, почему бы и нет?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39726956
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MAULERт.е. освобождения курсора не происходит.Вообще нужно всегда использовать курсор типа LOCAL, другие варианты ИМХО экзотика.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727094
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глобальные курсоры используются в очень специфических случаях, посему измените настройку базы по умолчанию на LOCAL курсор и спите спокойно.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727102
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

LOCAL И STATIC это деволт при не указанном явно
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727109
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

вот эта настройка:

ALTER DATABASE [db1] SET CURSOR_DEFAULT LOCAL WITH NO_WAIT
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727112
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовTaPaK,

вот эта настройка:

ALTER DATABASE [db1] SET CURSOR_DEFAULT LOCAL WITH NO_WAIT
это понятно, кто-то меняет на иное?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727122
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaK,

по умолчанию новая база создаётся с GLOBAL настройкой, насколько я вижу.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727128
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может быть у Вас этот парамер изменён в базе model?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727138
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовTaPaK,

по умолчанию новая база создаётся с GLOBAL настройкой, насколько я вижу.
день прожит не зря :)
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727152
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,
Я так понимаю, что "рвать по живому" при помощи "return" не стоит?!
Возможно, правильнее, в моём случае, присваивать какой-нибудь переменной "RolbackStatus" значение 1 после отката транзакции. Затем сравнивать её в While вместе с @@FETCHSTATUS ?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727156
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав КолосовМожет быть у Вас этот парамер изменён в базе model?

А как это посмотреть?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727205
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел. Просто в свойствах БД.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727207
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если в настройке БД стоит "Курсор по умолчанию: GLOBAL",

а в запросе у меня будет: DECLARE deleteCursor CURSOR LOCAL FAST_FORWARD FOR
...

то курсор будет локальным? Или этого недостаточно и придется изменять настройку БД?
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727226
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKВладислав КолосовTaPaK,

вот эта настройка:

ALTER DATABASE [db1] SET CURSOR_DEFAULT LOCAL WITH NO_WAIT
это понятно, кто-то меняет на иное?Это понятно, но лучше явно писать для курсоров LOCAL, всегда так делаю, ни разу не пожалел :-)

Да и вот, видите, в model бывает всякое :-)

MAULERalexeyvg,
Я так понимаю, что "рвать по живому" при помощи "return" не стоит?!
Возможно, правильнее, в моём случае, присваивать какой-нибудь переменной "RolbackStatus" значение 1 после отката транзакции. Затем сравнивать её в While вместе с @@FETCHSTATUS ?Ну, вообще, нужно обрабатывать ошибку, и не входить в бесконечный цикл. Это для префекционистов :-)

MAULERА если в настройке БД стоит "Курсор по умолчанию: GLOBAL",

а в запросе у меня будет: DECLARE deleteCursor CURSOR LOCAL FAST_FORWARD FOR

то курсор будет локальным? Или этого недостаточно и придется изменять настройку БД?Да, достаточно, и тогда настройки не будут иметь никакого значения. LOCAL и FAST_FORWARD - то, что нужно для курсолра в подавляющем большинстве случаев.

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


Кстати, если у вас там 8000 записей, то я не вижу необходимости делать удаление по 10 в цикле. Не умножайте сущности сверх необходимого.
Разве что процедура не ограничивается удалением из одной этой таблицы.
...
Рейтинг: 0 / 0
Помогите понять информацию по блокировке..
    #39727281
MAULER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgРазве что процедура не ограничивается удалением из одной этой таблицы.

Вы правы, не ограничивается.
...
Рейтинг: 0 / 0
55 сообщений из 55, показаны все 3 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите понять информацию по блокировке..
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]