#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)», при этом я не могу прочитать незафиксированные данные.