Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
invm
TaPaK
а откуда она возьмётся?
Мы рассматриваем работу в однопользовательском режиме?

нет, но ситуация кто первый встал у того и все тапки случится?
20 мар 18, 12:56    [21271120]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
msLex
Member

Откуда:
Сообщений: 7730
TaPaK
invm
пропущено...
Мы рассматриваем работу в однопользовательском режиме?

нет, но ситуация кто первый встал у того и все тапки случится?

При параллельном запуске этого скрипта (даже с непересекающимися ID) эскалация будет невозможна из-за IU на таблице.
20 мар 18, 13:09    [21271168]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
TaPaK
но ситуация кто первый встал у того и все тапки случится?
Это про эскалацию?
Случится, если на уровне таблице, на момент попытки эскалации, не будет ни одной чужой I*.
20 мар 18, 13:13    [21271185]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
msLex
Member

Откуда:
Сообщений: 7730
invm
Это про эскалацию?
Случится, если на уровне таблице, на момент попытки эскалации, не будет ни одной чужой I*.

IS допустимы, они вполне с U "уживаются"
20 мар 18, 13:14    [21271193]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
msLex
TaPaK
пропущено...

нет, но ситуация кто первый встал у того и все тапки случится?

При параллельном запуске этого скрипта (даже с непересекающимися ID) эскалация будет невозможна из-за IU на таблице.

это понятно, но у него немерянная транзакция с какими-то 15 мержами, и первая легко схватит всю таблицу и остальные дружно встанут
20 мар 18, 13:20    [21271213]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
msLex
Member

Откуда:
Сообщений: 7730
TaPaK
и первая легко схватит всю таблицу и остальные дружно встанут

если успеет, мы же говорим про параллельное выполнение.
к тому же, не каждый же поток будет добираться до 5000 заблокированных строк, так что "маленькие" порции будут намертво блокировать эскалацию
20 мар 18, 13:27    [21271229]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
TaPaK
и первая легко схватит всю таблицу
На основании чего?
20 мар 18, 13:27    [21271231]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
invm
TaPaK
и первая легко схватит всю таблицу
На основании чего?

того что на момент удаления никто больше с ней не конкурирует
20 мар 18, 13:32    [21271243]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
msLex
IS допустимы, они вполне с U "уживаются"
Только вот эскалация U будет до X, ибо U на таблицу не бывает.
20 мар 18, 13:47    [21271287]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
TaPaK
того что на момент удаления никто больше с ней не конкурирует
Т.е. таки рассматриваем вариант вообще без конкуренции, даже без читателей?
20 мар 18, 13:52    [21271309]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
invm
TaPaK
того что на момент удаления никто больше с ней не конкурирует
Т.е. таки рассматриваем вариант вообще без конкуренции, даже без читателей?

ну отсюда не видно что же там
20 мар 18, 13:53    [21271314]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 445
Доброго времени суток!
Подскажите пожалуйста, почему запись вида
DELETE tg 
FROM #tbGroup tg 
LEFT JOIN tbGroup g WITH(UPDLOCK, INDEX = IX_tbGroup_OrgId)
    ON  g.OrgId = @OrgId
	AND g.Id = tg.Id
WHERE g.Id IS NULL   

ил просто

SELECT COUNT(*) 
FROM tbGroup g WITH(UPDLOCK, INDEX = IX_tbGroup_OrgId) WHERE g.OrgId = @OrgId

делает кучу блокировок с TYPE = KEY (ровно столько, сколько групп в организации), причем блокируется именно индекс IX_tbGroup_OrgId,
вместо того, чтобы сделать 1 блокировку на диапазон.

Тем самым запрашиваемый диапазон действительно защищен от удаления и частично от обновления (от обновления поля OrgId),
но не защищен от добавления групп в ту же самую организацию (правда пока до конца неизвестно, нужно ли это вообще).

И все же интересно, как заставить сервер блокировать именно диапазон ключей индекса, в том числе и от вставки?
21 мар 18, 12:54    [21274077]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
зачем вам нужна блокировка на вставку в некий диапазон ключа?
21 мар 18, 12:56    [21274094]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
msLex
Member

Откуда:
Сообщений: 7730
Шамиль Фаридович
И все же интересно, как заставить сервер блокировать именно диапазон ключей индекса, в том числе и от вставки?

21268301
21 мар 18, 13:08    [21274165]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
msLex
Member

Откуда:
Сообщений: 7730
invm
msLex
IS допустимы, они вполне с U "уживаются"
Только вот эскалация U будет до X, ибо U на таблицу не бывает.


Хмм, действительно.
21 мар 18, 13:11    [21274182]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 445
msLex,
спасибо, работает, sp_lock показывает, что сменился режим блокировки на RangeS-U, правда я вижу всю ту же кучу блокировок, вместо одной. Впрочем, у sp_lock в столбце type нет разделения между блокировкой по ключу и диапазону ключей.
Интересна еще одна вещь: на тестовых где в таблице tbGroup чуть больше 5000 строк, запрос вида
SELECT COUNT(*) 
FROM tbGroup g WITH(UPDLOCK, INDEX = IX_tbGroup_OrgId)

вызывает 5000 блокировок с уровнем гранулярности = KEY. Почему сервер не поднимает его до уровня таблицы, ну или хотя бы страниц?
21 мар 18, 14:20    [21274508]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
blonduser
Member

Откуда:
Сообщений: 132
Шамиль Фаридович,

Каждая хранимая процедура создаст свой экземпляр #tbGroup.
От кого вы хотите заблокировать таблицу, от самого себя? :-)
21 мар 18, 14:31    [21274564]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
Режимы блокировки:
https://technet.microsoft.com/ru-ru/library/ms186396(v=sql.105).aspx
21 мар 18, 14:35    [21274580]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
Совместимость блокировок (компонент Database Engine):
https://technet.microsoft.com/ru-ru/library/ms186396(v=sql.105).aspx
21 мар 18, 14:35    [21274585]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Шамиль Фаридович
msLex,
спасибо, работает, sp_lock показывает, что сменился режим блокировки на RangeS-U, правда я вижу всю ту же кучу блокировок, вместо одной. Впрочем, у sp_lock в столбце type нет разделения между блокировкой по ключу и диапазону ключей.
Интересна еще одна вещь: на тестовых где в таблице tbGroup чуть больше 5000 строк, запрос вида
SELECT COUNT(*) 
FROM tbGroup g WITH(UPDLOCK, INDEX = IX_tbGroup_OrgId)

вызывает 5000 блокировок с уровнем гранулярности = KEY. Почему сервер не поднимает его до уровня таблицы, ну или хотя бы страниц?

1. 5к блокировок это нечто вроде "по умолчанию", сервер расчитывает количество от нескольких параметров
2. до страниц эскалации не бывает
21 мар 18, 14:35    [21274586]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
Блокировка диапазона ключей:
https://technet.microsoft.com/ru-ru/library/ms191272(v=sql.105).aspx

ЗЫ
это просто , чтобы народ мог посмотреть как в справочник, если вдруг нить рассуждений в текущем топике потерял
21 мар 18, 14:37    [21274594]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
msLex
Member

Откуда:
Сообщений: 7730
Шамиль Фаридович
спасибо, работает, sp_lock показывает, что сменился режим блокировки на RangeS-U, правда я вижу всю ту же кучу блокировок, вместо одной

Это потому, что реальный ключ неуникального индекса IX_tbGroup_OrgId (OrgId, <clustered index key>) и Range блокировки накладываются именно на него.

Шамиль Фаридович
вызывает 5000 блокировок с уровнем гранулярности = KEY. Почему сервер не поднимает его до уровня таблицы, ну или хотя бы страниц?

До станицы, как вам уже сказали, сервер не эскаликует блокировки, только если сразу их выберет (можно ему помочь через paglock)
А до таблицы мешает любой активный селекет к данным из таблицы (если у вас не RCSI)
21 мар 18, 15:32    [21274861]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
Шамиль Фаридович
И все же интересно, как заставить сервер блокировать именно диапазон ключей индекса, в том числе и от вставки?
Не бывает блокировки диапазона в таком виде, в каком вы его себе представляете - одна блокировка на произвольный диапазон ключей.
Блокировка диапазона в MSSQL - это блокировка (предыдущий ключ, ключ] и применяется исключительно для защиты от добавления строк в названный диапазон, чтобы обеспечить правильную работу на TIL serialiazable.
21 мар 18, 16:18    [21275058]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
Шамиль Фаридович
Member

Откуда: Саратов
Сообщений: 445
Всем спасибо за ответы!
Задача немного усложнилась. Всю постановку передавать не буду, сконцентрируюсь на одной из подзадач:
необходимо в начале транзакции вставлять в таблицу
tbEventCalculationList 
(id int identity(1, 1), 
EventId int not null,
DataFormingDate datetime not null)


записи из таблицы #tbEventToGroup(EventId int, tbGroupId...)
и защитить до конца транзакции tbEventCalculationList от вставки конкурирующими транзакциями строк с EventId из #tbEventToGroup,
то есть мне нужно что-то вроде
    INSERT tbEventCalculationList WITH (UPDLOCK, HOLDLOCK, INDEX = IX_tbEventCalculationList _EventId)
    (EventId, DataFormingDate) 
    SELECT EventId, DataFormingDate
    FROM #tbEventToGroup

Проблема в том, что ругается на подсказку про индекс:
Index hints are only allowed in a FROM or OPTION clause.

И я что-то не соображу, как засунуть хинт с индексом в предложение OPTION.
Или INSERT вообще не позволяет таких вещей, и я смогу диапазон ключей только после вставки и вызова подходящего предложения SELECT ?
5 апр 18, 11:12    [21314251]     Ответить | Цитировать Сообщить модератору
 Re: Заблокировать таблицу от удаления до конца транзакции  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Шамиль Фаридович,

по EventId уникальный индекс?
5 апр 18, 11:17    [21314280]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить