Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 sp_lock IX Mode - поясните плз.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
В BOL написано про намерения наложить X блокировку на подчиненные ресурсы.
Вопрос - что за они?
Вот кусок из sp_lock для этой таблицы
111 7 2133582639 0 TAB IS GRANT
111 7 1714105147 1 KEY (ffffffffffff) RangeIn- WAIT
111 7 1714105147 1 PAG 1:4545709 IX GRANT
111 7 1714105147 0 TAB IX GRANT
7 фев 13, 09:56    [13888667]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Подчиненные ресурсы для таблицы это ее страницы данных и ключи индекса
7 фев 13, 10:18    [13888790]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
Еще вопросик - почему намерения таки блокируют?
Или пропустил что-то?
7 фев 13, 10:41    [13888928]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
waszkiewicz
Еще вопросик - почему намерения таки блокируют?
Или пропустил что-то?

Какие намерения, кого блокируют? Поясните вашу мысль.

Вы лучше не sp_lock используйте, а sys.dm_tran_locks, sys.dm_os_waiting_tasks и т.д.
select * from sys.dm_os_waiting_tasks where session_id = 111
— в поле blocking_session_id увидите spid блокирующего процесса.
select * from sys.dm_tran_locks where request_session_id in (111, <spid блокирующего процесса>)
— так увидите блокировки, наложенные процессом 111 и блокирующим процессом.
7 фев 13, 11:00    [13889073]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
Блокировка с MODE=IX реально блокирует таблицу. Клиенты отваливаются по таймауту. Есть недопонимание в разнице между X и IX. Посему и вопрос
7 фев 13, 11:09    [13889151]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
waszkiewicz
Блокировка с MODE=IX реально блокирует таблицу.

Покажите, какой процесс блокируется этой блокировкой. Из вашего фрагмента sp_lock видно только ожидание на ресурсе KEY (ffffffffffff), тип запрашиваемой блокировки — RangeIn. И это не блокировка намерения.
7 фев 13, 11:26    [13889288]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
следующие 2 строки указывают явно на IX GRANT
7 фев 13, 11:29    [13889315]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
waszkiewicz
следующие 2 строки указывают явно на IX GRANT

GRANT означает, что запрошенная блокировка получена. Процесс из-за неё не простаивает.
WAIT — "Блокировка занята другим процессом, удерживающим блокировку в конфликтном режиме" (цитата из BOL).
7 фев 13, 11:38    [13889398]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
Правильно понимаю - spid=111 запросил IX и ее получил. Далее, довольный, держит страницу 1:4545709, что мешает другим процессам обратиться к этой странице?
Далее, kill 111 освобождает данную страницу к всеобщей радости
Так?
7 фев 13, 11:50    [13889501]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Далее, довольный, держит страницу 1:4545709, что мешает другим процессам обратиться к этой странице?

не просто обратиться, а заблокировать страницу _целиком_. или таблицу (IX на TAB).
7 фев 13, 11:53    [13889527]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
то есть, IX на страницу никак не мешает блокировать отдельные ключи на этой странице. а вот всю ее целиком - не дает.
7 фев 13, 11:55    [13889546]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
Тогда еще вопросик - другие клиенты пытаются сделать INSERT в эту таблицу (в это время) - и благополучно отваливаются по таймауту. Это как объяснить можно?
7 фев 13, 12:04    [13889630]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
waszkiewicz
держит страницу 1:4545709, что мешает другим процессам обратиться к этой странице

Мешает, только если другие процессы обращаются к этой же странице с несовместимым типом блокировки.
Узнать, совместимы ли два конкретных типа блокировок, можно, изучив таблицы по ссылке: http://msdn.microsoft.com/ru-ru/library/ms186396(v=sql.105).aspx
Например, если другой процесс запрашивает IX-блокировку к этой же странице, то процесс 111 этому никак не мешает. А если U-блокировку, то процесс 111 станет блокирующим процессом.
7 фев 13, 12:07    [13889652]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
waszkiewicz
Тогда еще вопросик - другие клиенты пытаются сделать INSERT в эту таблицу (в это время) - и благополучно отваливаются по таймауту. Это как объяснить можно?

Это можно объяснить, если всё же сделать запросы к sys.dm_os_waiting_tasks и sys.dm_tran_locks.
7 фев 13, 12:15    [13889739]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
Так боржоми пить уже поздно - 111 прибит. Хотелось разобраться, почему он так нагадил
7 фев 13, 13:25    [13890414]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
waszkiewicz
111 прибит

Этак шашкой махать — не завидую вашим пользователям.

waszkiewicz
Хотелось разобраться, почему он так нагадил

Каким образом вы определили, что именно 111 нагадил? Из вашего sp_lock видно только, что он сам ждал освобождения ресурса.

Любой процесс, делающий вставку в таблицу, накладывает как минимум одну IX-блокировку на страницу и ровно одну IX-блокировку на таблицу.
7 фев 13, 13:43    [13890553]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
Гость333

Любой процесс, делающий вставку в таблицу, накладывает как минимум одну IX-блокировку на страницу и ровно одну IX-блокировку на таблицу.

А вот где почитать про, какие инструкции T-SQL (без хинтов) какие блокировки накладывают? Чтобы потом вопросов лишних не задавать?
7 фев 13, 14:50    [13891263]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
Glory
Member

Откуда:
Сообщений: 104760
waszkiewicz
А вот где почитать про, какие инструкции T-SQL (без хинтов) какие блокировки накладывают?

Ваш вопрос вида "а как сервер будет выполнять запрос"
Оптимизатор построит план
В соответствии с планом будет идти доступ к объектам
У разных объектов и у сервера могут быть разные настройки, которые могут влиять на блокировки
Кроме того, есть уровень изоляции текущего соединения.
7 фев 13, 14:54    [13891322]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Гость333
Любой процесс, делающий вставку в таблицу, накладывает как минимум одну IX-блокировку на страницу и ровно одну IX-блокировку на таблицу.

Забыл добавить "в типичных условиях". Потому что возможны варианты наложения X-блокировки на таблицу, тогда страничных блокировок и блокировок ключа не будет.

waszkiewicz
А вот где почитать про, какие инструкции T-SQL (без хинтов) какие блокировки накладывают?

Ну, наверное, тут или тут.

Также можно самому ставить эксперименты. Вот, например, я могу так воспроизвести блокировку RangeI-N.
Создание тестовой таблицы:
create table dbo.lock_test(id int identity constraint pk_lock_test primary key, a int);


Открываем новую коннекцию (назовём её "первой"), в ней вставляем запись в таблицу, предварительно сделав выборку с уровнем изоляции serializable. При этом мониторим накладываемые блокировки:

set transaction isolation level read committed;
begin transaction;
declare @id int;
select @id = id from dbo.lock_test with(serializable) where id = ident_current('dbo.lock_test') + 1;
select 'locks after serializable read'
select * from sys.dm_tran_locks where request_session_id = @@spid;
insert dbo.lock_test(a) values(1);
select 'locks after insert'
select * from sys.dm_tran_locks where request_session_id = @@spid;


Транзакцию не коммитим, она будет держать блокировки — одну IX на таблице, одну IX на странице, одну RangeS-S на ключе (ffffffffffff) — это фиктивный ключ, означающий выход за пределы имеющихся диапазонов ключей, и одну RangeX-X на другом, реальном ключе.

Открываем вторую коннекцию и делаем ещё одну вставку:
set transaction isolation level read committed;
begin transaction;
insert dbo.lock_test(a) values(2);

Запрос "зависает".

Открываем третью коннекцию и мониторим ситуацию с блокировками:
select * from sys.dm_os_waiting_tasks where session_id = <spid второго процесса>

Мы увидим wait_type = LCK_M_RIn_NL, blocking_session_id = <spid первого процесса>, ну и всякую полезную информацию в resource_description.

Дальше в третьей коннекции выполняем запрос:
select * from sys.dm_tran_locks where request_session_id in (<spid первого процесса>, <spid второго процесса>)

Смотрим на ресурсы, на request_mode, на request_status, в таблицу совместимости блокировок, делаем выводы.
7 фев 13, 16:41    [13892496]     Ответить | Цитировать Сообщить модератору
 Re: sp_lock IX Mode - поясните плз.  [new]
waszkiewicz
Member

Откуда:
Сообщений: 1086
Спасибо
7 фев 13, 17:27    [13892910]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить