SQL Server TABLOCKX не блокирует таблицу

#sql #sql-server-2008 #sql-server-2016

#sql #sql-server-2008 #sql-server-2016

Вопрос:

У меня есть большая таблица с миллионами записей, и я пытаюсь использовать TABLOCKX , я должен обновить некоторые данные в exclusive.

Я тестирую эту транзакцию

 BEGIN TRANSACTION

SELECT * 
FROM [MyDatabase].[dbo].[MyTable] WITH (TABLOCKX) 
WHERE 0 = 1

WAITFOR DELAY '00:30'

ROLLBACK TRANSACTION
  

Если я попытаюсь выбрать данные таким образом

 SELECT *  
FROM [MyDatabase].[dbo].[MyTable]
  

В таблице нет блокировки, я могу прочитать данные.

Но я обнаружил, что если я попытаюсь выбрать из таблицы другим способом, блокировка сработает!

 SELECT *  
FROM [MyDatabase].[dbo].[MyTable] WITH (TABLOCKX)
  

Почему? Я попытался создать другой тест таблицы с записью 3 или 4, и блокировка работает нормально без «WITH (TABLOCKX)».

Комментарии:

1. Здравствуйте, я думаю, проблема в том, что условие WHERE при 0 = 1 всегда равно FALSE.

2. @DanielE. Я попробовал сейчас, но это не работает … : (

3. Почему вы не устанавливаете isolation level to serializable ? learn.microsoft.com/en-us/sql/t-sql/statements /…

4. Что происходит, что заставляет вас думать, что блокировка работает / не работает? Также вы используете 2008 или 2016 год? Зачем помечать оба?

5. @TabAlleman Я отмечаю оба, потому что я тестировал это в 2008 и 2016 годах, и оба имеют одинаковое странное поведение. Блокировка работает только для запроса с помощью «WITH (TABLOCKX)», при этом я не могу прочитать незафиксированные данные.