byte916
@byte916

Почему не срабатывают блокировки?

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

Во втором читаю из этой же таблицы
SELECT TOP (1000) *
  FROM SomeTable


И чтение происходит сразу, без всяких задержек, т.е. никакой блокировки не происходит. В каком месте ошибка и что нужно сделать, чтобы заблокировать все операции на время выполнения транзакции?
  • Вопрос задан
  • 86 просмотров
Решения вопроса 1
Mikhail_E
@Mikhail_E
1С, SQL
Думаю дело в "READ_COMMITTED_SNAPSHOT = ON" на тестируемой дб. При включении этого параметра, MSSQL работает в эмуляции версионника а не блокировщика.
Попробуйте перед тестом выполнить это :
ALTER DATABASE [ServerTest] SET ALLOW_SNAPSHOT_ISOLATION off; 
ALTER DATABASE [ServerTest] SET READ_COMMITTED_SNAPSHOT off

П.С.: Инфо для чтения

UPD: Если есть необходимость блочить строки с включенным RCSI нужно добавлять хинт "WITH (UPDLOCK)"
т.е.:
begin tran
SELECT TOP (1000) *
  FROM SomeTable With (UPDLOCK) 
waitfor delay '00:00:15'
commit tran

и
SELECT TOP (1000) *
  FROM SomeTable  WITH (UPDLOCK)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ScriptKiddo
Вам необходимо использовать одновременно два табличных указания

WITH(TABLOCKX, HOLDLOCK)

TABLOCKX - монопольно блокирует таблицу, HOLDLOCK - включает режим SERIALIZABLE, что включает в себя следующее:

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

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

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

https://docs.microsoft.com/en-us/sql/t-sql/stateme...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы