powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как определить тип блокировки?
9 сообщений из 9, страница 1 из 1
Как определить тип блокировки?
    #32058222
Sharapp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите пожалуйста, как можно узнать строчная или страничная блокировка таблицы используется и как ее можно изменить?
Подключаюсь через ADO.
...
Рейтинг: 0 / 0
Как определить тип блокировки?
    #32058224
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запустите Profiler и настройте отслеживание событий, связанных с блокировками.
...
Рейтинг: 0 / 0
Как определить тип блокировки?
    #32058285
Фотография Белов Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изменить блокировку, ИМХО, можно с помощью подсказок для блокировок
...
Рейтинг: 0 / 0
Как определить тип блокировки?
    #32058294
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Белов Владимир

Можно указать тип блокировки ( HOLDLOCK, UPDLOCK etc) с помощью хинтов в запросе, но не факт, что получите ожидаемый физический уровень блокировки ( строка, страница ), т.к. оптимизатор может изменять (повышать) уровень блокировки в зависимости от плана выполнения запроса.

2 Sharapp
Если Вы пытаетесь управлять блокировками из клиентского приложения (как в десктопных СУБД), то лучше сразу плюньте (слюной) на это, т.к. не годится переносить функции сервера на клиента. Это однозначно тупиковый подход.
Здесь уже неоднократно обсуждались эти вопросы, так что можете воспользоваться поиском по темам с целью прояснить для себя этот вопрос.
...
Рейтинг: 0 / 0
Как определить тип блокировки?
    #32058407
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Jimmy. Так ты не те хинты приводишь... Есть еще хины TabLock, RowLock, PagLock... Ты полагаешь, что оптимизатор с ними все равно сделает по-своему?
...
Рейтинг: 0 / 0
Как определить тип блокировки?
    #32058523
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Garya
С TABLOCK он уже врядли что-нить сделает, а вот с ROWLOCK, PAGLOCK - запросто. Например, если при указанном хинте ROWLOCK группа записей находится на одной странице, то серверу проще поднять несколько RL блокировок до одной PL (ресурсов меньше требуется).

А за некорректность перечисления - да, есть такое, но я надеялся на магические etc и любознательность аудитории. Сорри, если зря :0)
...
Рейтинг: 0 / 0
Как определить тип блокировки?
    #32058552
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я полагал, что ежели я сказал SQL-серверу:
update SomeTable set SomeField=SomeField+1 with (RowLock)
..то он уже не перейдет ни на страничную блокировку, ни, тем более на, табличную. Потому как нафига же тогда хинты ставить, если они просто мимо ушей пропускаются? SQL-сервер, ИМХО, в этом случае слопает кучу оперативной памяти для того, чтобы сохранить в ней информацию о каждой заблокированной строке, и эскалация блокировок происходить не будет.
Эскалация может происходить, когда подобный хинт не указан, либо указан хинт другого рода.

В своем ответе я уверен. Потому как указанием хинта with (RowLock) на практике борюсь с дедлоками, возникающими как раз из-за эскалации блокировок. Именно этот хинт позволяет избежать эскалации и заблокировать только те записи, которые на самом деле модифицируются текущим запросом, оставив незаблокированными те записи, которые может попытаться в этот момент модифицировать другой юзер.
...
Рейтинг: 0 / 0
Как определить тип блокировки?
    #32058555
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, конечно же:
update SomeTable with (RowLock) set SomeField=SomeField+1
...
Рейтинг: 0 / 0
Как определить тип блокировки?
    #32058692
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Garya

Проверил практически. Есть таблица, где несколько тысяч записей (менее 10000).
Сделал так (MS SQL7 + SP3):
Код: plaintext
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.
 /* с хинтом ROWLOCK */ 
begin tran
update MyTable (with rowlock) set Field1 = Field1 where id between  1500  and  1700 
go
sp_lock <my proc id>

 /* результат - ПОЧТИ все блокировки для моей таблы типа 
   KEY или RID. Но ЕСТЬ несколько PAG! */ 

rollback tran

 /* с хинтом PAGLOCK */ 
begin tran
update MyTable (with paglock) set Field1 = Field1 where id between  1500  and  1700 
go
sp_lock <my proc id>

 /* результат - все блокировки для моей таблы типа PAG */ 

rollback tran

 /* без хинтов */ 
begin tran
update MyTable set Field1 = Field1 where id between  1500  and  1700 
go
sp_lock <my proc id>

 /* результат - большинство блокировок KEY или RID, однако
есть и PAG. Возможно PAG стало больше - не уточнял. */ 


Позволю себе сделать вывод, что я был прав. Однако, если это все же не так, хотелось бы услышать окончательный и аргументированный ответ.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как определить тип блокировки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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