#sql #sql-server #transactions #locking
#sql #sql-сервер #транзакции #блокировка
Вопрос:
У меня есть представление SQL. Я использую READPAST
это представление SQL. Потому что я не хочу видеть грязные данные. Но SQL READPAST
заблокировал таблицу этого представления SQL. Я не хочу блокировать таблицу, я просто хочу заблокировать строку.
Какой метод является правильным?
Комментарии:
1. Блокировки, которые SQL Server использует с вашим запросом, зависят от всех операций вашей текущей транзакции, а также от фактического запроса, который вы используете вместе с базовыми таблицами и индексами представления. Для полного ответа вам нужно будет включить всю эту информацию в свой вопрос.
2. Спасибо за ответ. Я поделюсь своим запросом. Но сначала я попробую уровень изоляции.
Ответ №1:
Когда вы выбираете из таблицы, вы все равно устанавливаете на нее общую блокировку … но если ваша таблица заблокирована, и вы не хотите видеть грязные данные рядом с использованием readpast, вы должны убедиться, что в вашей таблице есть индекс, а затем установите для блокировки страницы значение off, а для блокировки строк — on .. конечно, ваш запросв индексированном столбце должно быть предложение where.. https://learn.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-table?view=sql-server-2017
Ответ №2:
Похоже, проблема заключается в уровне изоляции.Вы должны использовать моментальный снимок с фиксацией чтения, если вы используете sql server.Это обеспечивает получение только зафиксированных данных.Также это не приводит к блокировке таблицы.Но вы должны включить его на уровне базы данных.Вы можете посмотреть https://www.google.com/amp/s/www.red-gate.com/simple-talk/sql/performance/read-committed-snapshot-isolation-high-version_ghost_record_count/amp / для настройки. Также readpast не является решением.Он пропускает заблокированные строки.Таким образом, вы получаете недостающие результаты.Когда строка обновляется, ваш запрос select игнорирует эту строку.Но на уровне изоляции с фиксацией чтения вы получаете фиксированную версию этой строки, даже если она заблокирована другой транзакцией, и этот уровень изоляции не блокирует вашу таблицу.Я предполагаю, что вы используете уровень изоляции по умолчанию для транзакции.если вы не задаете уровень изоляции для транзакции, она использует уровень изоляции по умолчанию, и это фиксируется на чтение.Моментальный снимок с фиксацией чтения работает только на уровне изоляции с фиксацией чтения без блокировки.За исключением этого, например, на сериализуемом уровне изоляции он продолжает блокироваться.Таким образом, вы можете использовать уровень изоляции по умолчанию для транзакции, вызывающей ваше представление.
Комментарии:
1. Спасибо за ответ. Я попробую уровень изоляции.
2. При использовании моментального снимка с фиксацией чтения вы должны быть осторожны с базой данных tempdb. Например, в основном диск tempdb должен быть на ssd, если ваших одновременных транзакций слишком много. Вы можете посмотреть на logicalread.com/sql-server-tempdb-considerations-w02 /. …