powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему не срабатывают блокировки на таблицу?
9 сообщений из 9, страница 1 из 1
Почему не срабатывают блокировки на таблицу?
    #40083941
Byte916
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вопрос не новый, но, почему то, ответа на него я не нашёл.
Пытаюсь заблокировать доступ к таблице на чтение (и запись).
Открываю два экземпляра MS SMS, подключаюсь к одной и той же базе из обоих.

В одном делаю блокирующий (как мне кажется) запрос
Код: sql
1.
2.
3.
4.
5.
begin tran
SELECT TOP (1000) *
  FROM SomeTable With (TABLOCKX) -- Пробовал TABLOCKX HOLDLOCK, LOCKX, результат тот же
waitfor delay '00:00:15'
commit tran


Пока он выполняется, во втором пытаюсь читать из этой же таблицы
Код: sql
1.
2.
SELECT TOP (1000) *
  FROM SomeTable


И никаких проблем с чтением не испытываю - данные сразу читаются, хотя согласно документации и всему, что я нашёл на форумах - не должны.
Что я делаю не так и как надо делать?
...
Рейтинг: 0 / 0
Почему не срабатывают блокировки на таблицу?
    #40083944
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Byte916,

Уверены, что на этой SomeTable на момент выполнения запроса с tablockx нет никаких блокировок? Поскольку запрашивается эксклюзивная блокировка, то при наличии какой-либо блокировки на таблице сервер будет какое-то время (которое у SSMS равно бесконечности, а у клиентских приложений по-разному, у дотнетовского провайдера 30 секунд вроде как) ждать освобождения ресурса, и только потом наложит блокировку. Вполне возможно, что у вас запрос с tablockx ждет, когда существующие блокировки отвалятся, а запросу без tablockx они вообще не важны (может, там какие-нибудь Sch-S висят), и он выполняется нормально.
Сделайте так:
Код: sql
1.
2.
3.
4.
5.
6.
begin tran
set lock_timeout 0;
SELECT TOP (1000) *
  FROM SomeTable With (TABLOCKX)
waitfor delay '00:00:15'
commit tran


Byte916
Открываю два экземпляра MS SMS

SSMS в одном запущенном экземпляре для каждой отдельной вкладки открывает новую сессию, если что. Для теста хватит двух вкладок в одной вертикальной или горизонтальной группе.
...
Рейтинг: 0 / 0
Почему не срабатывают блокировки на таблицу?
    #40083950
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Byte916
Вопрос не новый, но, почему то, ответа на него я не нашёл.
Пытаюсь заблокировать доступ к таблице на чтение (и запись).
Открываю два экземпляра MS SMS, подключаюсь к одной и той же базе из обоих.

В одном делаю блокирующий (как мне кажется) запрос
Код: sql
1.
2.
3.
4.
5.
begin tran
SELECT TOP (1000) *
  FROM SomeTable With (TABLOCKX) -- Пробовал TABLOCKX HOLDLOCK, LOCKX, результат тот же
waitfor delay '00:00:15'
commit tran


Пока он выполняется, во втором пытаюсь читать из этой же таблицы
Код: sql
1.
2.
SELECT TOP (1000) *
  FROM SomeTable


И никаких проблем с чтением не испытываю - данные сразу читаются, хотя согласно документации и всему, что я нашёл на форумах - не должны.
Что я делаю не так и как надо делать?


Код: sql
1.
With (TABLOCKX, HOLDLOCK)
...
Рейтинг: 0 / 0
Почему не срабатывают блокировки на таблицу?
    #40083952
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Код: sql
1.
With (TABLOCKX, HOLDLOCK)


HOLDLOCK просто удерживает блокировку на время всей транзакции, даже если блокируемый ресурс уже не используется. Здесь в транзакции кроме селекта, накладывающего блокировку, ничего больше нет, и смысла в HOLDLOCK именно в данном случае никакого.
...
Рейтинг: 0 / 0
Почему не срабатывают блокировки на таблицу?
    #40083953
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
aleks222
Код: sql
1.
With (TABLOCKX, HOLDLOCK)


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


Разве тредстартер о смысле спрашивает?
...
Рейтинг: 0 / 0
Почему не срабатывают блокировки на таблицу?
    #40083966
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Byte916,

У БД включен RCSI. Поэтому во второй сессии надо так
Код: sql
1.
select * from SomeTable with (readcommittedlock);


Ну или повысить TIL.
...
Рейтинг: 0 / 0
Почему не срабатывают блокировки на таблицу?
    #40083968
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Byte916,

У БД включен RCSI. Поэтому во второй сессии надо так
Код: sql
1.
select * from SomeTable with (readcommittedlock);



Ну или повысить TIL.



SELECT TOP (1000) *
FROM SomeTable With (TABLOCKX)

держит блокировку только до конца стейтмента, соответственно в момент waitfor delay '00:00:15' никаких блокировок на таблицу уже нет.
...
Рейтинг: 0 / 0
Почему не срабатывают блокировки на таблицу?
    #40083974
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex,

У него обернуто в транзакцию - значит до конца транзакции, ибо X
...
Рейтинг: 0 / 0
Почему не срабатывают блокировки на таблицу?
    #40084167
Byte916
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема оказалась в
Код: sql
1.
READ_COMMITTED_SNAPSHOT = ON


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


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