Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Укрупнение блокировок смешанного типа  [new]
ХромойЗаяц
Guest
Добрый вечер, подскажите как происходит укрупнение блокировок для блокировок смешанного типа (например X и S). Предположим с кластеризованной таблицей работает одна транзакция, я обновил 4999 строк и и наложил другим оператором(в этой же транзакции) еше одну S блокировку, но эскалация блокировок не происходит (хотя происходит при 5000 X блокировок строк). Как понять на каком числе S блокировок произойдет укрупнение блокировок?
15 апр 16, 23:16    [19064962]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
iljy
Member

Откуда:
Сообщений: 8711
ХромойЗаяц,

а вы вообще пробовали документацию поискать, или сразу вопрос задать решили?

первая ссылка в гугле,
MSDN
Укрупнение блокировки включается в том случае, если не выключено для таблицы с помощью параметра ALTER TABLE SET LOCK_ESCALATION, и если выполняется одно из следующих условий.
Одна инструкция Transact-SQL получает более 5 000 блокировок в одной несекционированной таблице или индексе.

..................

Инструкция SELECT получает следующие блокировки.
.....
Блокировки с намерением совмещаемого доступа на все страницы кластеризованного индекса, содержащего эти строки, если эти страницы уже не защищены IX-блокировкой.
Не получает блокировки на кластеризованный индекс или таблицу, поскольку они уже защищены IX-блокировками.
15 апр 16, 23:30    [19064989]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
Хромой заяц
Guest
iljy,

Не происходит эскалация при более 5000 блокировок
15 апр 16, 23:47    [19065060]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
iljy
Member

Откуда:
Сообщений: 8711
Хромой заяц
iljy,

Не происходит эскалация при более 5000 блокировок


MSDN
Одна инструкция Transact-SQL получает более 5 000 блокировок в одной несекционированной таблице или индексе.


У вас одна инструкция получает более 5000 блокировок? При этом часть S, часть X?
16 апр 16, 00:00    [19065112]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
ХромойЗаяц
Guest
iljy,

Неправильно сформулировал условия, но действительно даже при более чем 5000 блокировок на одну инструкцию эскалация может не вызываться. В не зависимости от того, в одной они транзакции выполняются или нет. (При отсутствии конкурирующих транзакций и запрета эскалации)
16 апр 16, 07:38    [19065584]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
iljy
Member

Откуда:
Сообщений: 8711
ХромойЗаяц
iljy,

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



... Чет я не понял: а как одна инструкция может выполняться не в одной транзакции???

Вообще разговор странный получается, из серии диагнозов по юзерпику. Если есть конкретная воспроизводимая проблема (или несоответствие), то выкладывайте репо, ну или хотя бы детальное описание, с запросами, структурами таблиц, методикой подсчета блокировок и т.п., тогда и поговорим.
16 апр 16, 09:20    [19065675]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
ХромойЗаяц
Guest
iljy,

use tempdb
go

if object_id('tbl') is not null
	drop table tbl
go

create table tbl (i int identity primary key, name varchar(100))
go

insert into tbl(name)
select top (10000) null from sys.all_columns, sys.all_columns s2
go

begin transaction
go
select top(6250) * from tbl with (rowlock, xlock)
go
select t.resource_type, t.request_mode, count(*) 'count' from sys.dm_tran_locks t
where t.request_session_id = @@spid and t.resource_database_id = db_id('tempdb')
group by t.resource_type, t.request_mode
order by t.resource_type
go
rollback
go

drop table tbl
go


У меня было 6000 X блокировок ключа но эскалации не было, только лишь при 6238 блокировках, и это число меняется от таблицы к таблице
16 апр 16, 10:10    [19065724]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
iljy
Member

Откуда:
Сообщений: 8711
ХромойЗаяц,

вы че, издеваетесь чтоли?
MSDN
ROWLOCK
Specifies that row locks are taken when page or table locks are ordinarily taken.
16 апр 16, 10:17    [19065731]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
iljy
Member

Откуда:
Сообщений: 8711
ХромойЗаяц,

ну и, несмотря на все происки, у меня получается
resource_typerequest_modecount
OBJECTX1



Сервер
Microsoft SQL Server 2008 R2 (SP3) - 10.50.6220.0 (X64) Mar 19 2015 12:32:14 Copyright (c) Microsoft Corporation Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


Так что еще версию вашу надо посмотреть.
16 апр 16, 10:23    [19065746]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
Хромой заяц
Guest
iljy,
Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 
	Feb 20 2014 20:04:26 
	Copyright (c) Microsoft Corporation
	Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
16 апр 16, 10:42    [19065779]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
Хромой заяц
Guest
iljy,

А вы число строк в запросе меняли например на 6000?
16 апр 16, 10:45    [19065781]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
iljy
Member

Откуда:
Сообщений: 8711
Хромой заяц
iljy,
Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 


Это голый RTM, поставьте сервиспак.

Хромой заяц
iljy,

А вы число строк в запросе меняли например на 6000?


Ну да, все правильно:

MSDN
Одна инструкция Transact-SQL получает более 5 000 блокировок в одной несекционированной таблице или индексе.

....
компонент Database Engine проверяет возможные укрупнения блокировки для каждых 1250 новых блокировок,


Т.е. проверки происходят на 1250й, 2500й, 3750й, 5000й и 6250й блокировках. На 5000й условие укрупнения еще не выполнено, а на 6250 - вполне. Выполните:
use tempdb
go

if object_id('tbl') is not null drop table tbl
if object_id('tbl2') is not null drop table tbl2
go

create table tbl (i int identity primary key, name varchar(100))
create table tbl2 (i int identity primary key, name varchar(100))
go

insert into tbl(name)
select top (10000) null from sys.all_columns, sys.all_columns s2
go

begin transaction
insert into tbl2(name)
select top (300) null from sys.all_columns, sys.all_columns s2

select top(6200) * from tbl with (xlock)
go

select t.resource_type, t.request_mode, count(*) 'count' from sys.dm_tran_locks t
where t.request_session_id = @@spid and t.resource_database_id = db_id('tempdb')
group by t.resource_type, t.request_mode
order by t.resource_type
go
rollback
go

drop table tbl

и наступит просветление.
16 апр 16, 11:09    [19065811]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
ХромойЗаяц
Guest
iljy,

Ну все таки 6238 != 6250, хотя конечно можно рассматривать как погрешность.
16 апр 16, 12:14    [19065906]     Ответить | Цитировать Сообщить модератору
 Re: Укрупнение блокировок смешанного типа  [new]
iljy
Member

Откуда:
Сообщений: 8711
ХромойЗаяц
iljy,

Ну все таки 6238 != 6250, хотя конечно можно рассматривать как погрешность.


Нельзя. Там еще есть страничные блокировки и табличные (намерения, но все равно блокировки).
16 апр 16, 18:39    [19066941]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить