powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заблокировать таблицу от удаления до конца транзакции
25 сообщений из 67, страница 2 из 3
Заблокировать таблицу от удаления до конца транзакции
    #39617446
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmTaPaKа откуда она возьмётся?Мы рассматриваем работу в однопользовательском режиме?
нет, но ситуация кто первый встал у того и все тапки случится?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39617469
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKinvmпропущено...
Мы рассматриваем работу в однопользовательском режиме?
нет, но ситуация кто первый встал у того и все тапки случится?
При параллельном запуске этого скрипта (даже с непересекающимися ID) эскалация будет невозможна из-за IU на таблице.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39617473
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKно ситуация кто первый встал у того и все тапки случится?Это про эскалацию?
Случится, если на уровне таблице, на момент попытки эскалации, не будет ни одной чужой I*.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39617475
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmЭто про эскалацию?
Случится, если на уровне таблице, на момент попытки эскалации, не будет ни одной чужой I*.
IS допустимы, они вполне с U "уживаются"
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39617480
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexTaPaKпропущено...

нет, но ситуация кто первый встал у того и все тапки случится?
При параллельном запуске этого скрипта (даже с непересекающимися ID) эскалация будет невозможна из-за IU на таблице.
это понятно, но у него немерянная транзакция с какими-то 15 мержами, и первая легко схватит всю таблицу и остальные дружно встанут
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39617486
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKи первая легко схватит всю таблицу и остальные дружно встанут
если успеет, мы же говорим про параллельное выполнение.
к тому же, не каждый же поток будет добираться до 5000 заблокированных строк, так что "маленькие" порции будут намертво блокировать эскалацию
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39617487
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKи первая легко схватит всю таблицуНа основании чего?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39617491
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmTaPaKи первая легко схватит всю таблицуНа основании чего?
того что на момент удаления никто больше с ней не конкурирует
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39617503
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLexIS допустимы, они вполне с U "уживаются"Только вот эскалация U будет до X, ибо U на таблицу не бывает.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39617508
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKтого что на момент удаления никто больше с ней не конкурируетТ.е. таки рассматриваем вариант вообще без конкуренции, даже без читателей?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39617511
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmTaPaKтого что на момент удаления никто больше с ней не конкурируетТ.е. таки рассматриваем вариант вообще без конкуренции, даже без читателей?
ну отсюда не видно что же там
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618122
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток!
Подскажите пожалуйста, почему запись вида
Код: sql
1.
2.
3.
4.
5.
6.
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   


ил просто

Код: sql
1.
2.
SELECT COUNT(*) 
FROM tbGroup g WITH(UPDLOCK, INDEX = IX_tbGroup_OrgId) WHERE g.OrgId = @OrgId


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

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

И все же интересно, как заставить сервер блокировать именно диапазон ключей индекса, в том числе и от вставки?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618130
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем вам нужна блокировка на вставку в некий диапазон ключа?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618140
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль ФаридовичИ все же интересно, как заставить сервер блокировать именно диапазон ключей индекса, в том числе и от вставки?
21268301
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618146
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmmsLexIS допустимы, они вполне с U "уживаются"Только вот эскалация U будет до X, ибо U на таблицу не бывает.

Хмм, действительно.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618226
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,
спасибо, работает, sp_lock показывает, что сменился режим блокировки на RangeS-U, правда я вижу всю ту же кучу блокировок, вместо одной. Впрочем, у sp_lock в столбце type нет разделения между блокировкой по ключу и диапазону ключей.
Интересна еще одна вещь: на тестовых где в таблице tbGroup чуть больше 5000 строк, запрос вида
Код: sql
1.
2.
SELECT COUNT(*) 
FROM tbGroup g WITH(UPDLOCK, INDEX = IX_tbGroup_OrgId)


вызывает 5000 блокировок с уровнем гранулярности = KEY. Почему сервер не поднимает его до уровня таблицы, ну или хотя бы страниц?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618239
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридович,

Каждая хранимая процедура создаст свой экземпляр #tbGroup.
От кого вы хотите заблокировать таблицу, от самого себя? :-)
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618242
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618245
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совместимость блокировок (компонент Database Engine):
https://technet.microsoft.com/ru-ru/library/ms186396(v=sql.105).aspx
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618246
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль ФаридовичmsLex,
спасибо, работает, sp_lock показывает, что сменился режим блокировки на RangeS-U, правда я вижу всю ту же кучу блокировок, вместо одной. Впрочем, у sp_lock в столбце type нет разделения между блокировкой по ключу и диапазону ключей.
Интересна еще одна вещь: на тестовых где в таблице tbGroup чуть больше 5000 строк, запрос вида
Код: sql
1.
2.
SELECT COUNT(*) 
FROM tbGroup g WITH(UPDLOCK, INDEX = IX_tbGroup_OrgId)


вызывает 5000 блокировок с уровнем гранулярности = KEY. Почему сервер не поднимает его до уровня таблицы, ну или хотя бы страниц?
1. 5к блокировок это нечто вроде "по умолчанию", сервер расчитывает количество от нескольких параметров
2. до страниц эскалации не бывает
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618249
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блокировка диапазона ключей:
https://technet.microsoft.com/ru-ru/library/ms191272(v=sql.105).aspx

ЗЫ
это просто , чтобы народ мог посмотреть как в справочник, если вдруг нить рассуждений в текущем топике потерял
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618314
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридовичспасибо, работает, sp_lock показывает, что сменился режим блокировки на RangeS-U, правда я вижу всю ту же кучу блокировок, вместо одной
Это потому, что реальный ключ неуникального индекса IX_tbGroup_OrgId (OrgId, <clustered index key>) и Range блокировки накладываются именно на него.

Шамиль Фаридовичвызывает 5000 блокировок с уровнем гранулярности = KEY. Почему сервер не поднимает его до уровня таблицы, ну или хотя бы страниц?
До станицы, как вам уже сказали, сервер не эскаликует блокировки, только если сразу их выберет (можно ему помочь через paglock)
А до таблицы мешает любой активный селекет к данным из таблицы (если у вас не RCSI)
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39618356
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль ФаридовичИ все же интересно, как заставить сервер блокировать именно диапазон ключей индекса, в том числе и от вставки?Не бывает блокировки диапазона в таком виде, в каком вы его себе представляете - одна блокировка на произвольный диапазон ключей.
Блокировка диапазона в MSSQL - это блокировка (предыдущий ключ, ключ] и применяется исключительно для защиты от добавления строк в названный диапазон, чтобы обеспечить правильную работу на TIL serialiazable.
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39625967
Шамиль Фаридович
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за ответы!
Задача немного усложнилась. Всю постановку передавать не буду, сконцентрируюсь на одной из подзадач:
необходимо в начале транзакции вставлять в таблицу
Код: sql
1.
2.
3.
4.
tbEventCalculationList 
(id int identity(1, 1), 
EventId int not null,
DataFormingDate datetime not null)



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


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


И я что-то не соображу, как засунуть хинт с индексом в предложение OPTION.
Или INSERT вообще не позволяет таких вещей, и я смогу диапазон ключей только после вставки и вызова подходящего предложения SELECT ?
...
Рейтинг: 0 / 0
Заблокировать таблицу от удаления до конца транзакции
    #39625973
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шамиль Фаридович,

по EventId уникальный индекс?
...
Рейтинг: 0 / 0
25 сообщений из 67, страница 2 из 3
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Заблокировать таблицу от удаления до конца транзакции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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