Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как определить тип блокировки? / 9 сообщений из 9, страница 1 из 1
15.10.2002, 08:55:04
    #32058222
Sharapp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить тип блокировки?
Подскажите пожалуйста, как можно узнать строчная или страничная блокировка таблицы используется и как ее можно изменить?
Подключаюсь через ADO.
...
Рейтинг: 0 / 0
15.10.2002, 09:15:49
    #32058224
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить тип блокировки?
Запустите Profiler и настройте отслеживание событий, связанных с блокировками.
...
Рейтинг: 0 / 0
15.10.2002, 11:18:02
    #32058285
Белов Владимир
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить тип блокировки?
Изменить блокировку, ИМХО, можно с помощью подсказок для блокировок
...
Рейтинг: 0 / 0
15.10.2002, 11:31:11
    #32058294
Jimmy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить тип блокировки?
2 Белов Владимир

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

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

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

В своем ответе я уверен. Потому как указанием хинта with (RowLock) на практике борюсь с дедлоками, возникающими как раз из-за эскалации блокировок. Именно этот хинт позволяет избежать эскалации и заблокировать только те записи, которые на самом деле модифицируются текущим запросом, оставив незаблокированными те записи, которые может попытаться в этот момент модифицировать другой юзер.
...
Рейтинг: 0 / 0
15.10.2002, 19:25:08
    #32058555
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как определить тип блокировки?
Пардон, конечно же:
update SomeTable with (RowLock) set SomeField=SomeField+1
...
Рейтинг: 0 / 0
16.10.2002, 11:49:08
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как определить тип блокировки? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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