Мне нужно написать оператор выбора sql без создания каких-либо блокировок в таблицах, но прочитать зафиксированные записи.
Может кто-нибудь поможет, пожалуйста ...
2 ответа
Чтение / выбор данных на уровне изоляции транзакции по умолчанию не блокирует таблицу, но получает нечто, называемое общими блокировками на ресурсах. Это означает, что несколько пользователей могут читать одни и те же строки, получая общие блокировки для ресурсов.
И когда пользователь изменяет строку, он получает эксклюзивную блокировку ресурсов. Эксклюзивная блокировка означает, что никто другой не может получить доступ к данным во время их изменения. Он заблокирован исключительно этим пользователем.
Следовательно, мораль этой истории - придерживаться уровня изоляции транзакций по умолчанию Read Committed
, и он получит блокировку (разделяемую блокировку) на строку перед ее извлечением, чтобы избежать грязного чтения.
В противном случае менее строгий уровень изоляции чтение незафиксированных не приводит к блокировкам и приведет к грязному чтению.
Вы можете включить опцию базы данных READ_COMMITTED_SNAPSHOT. Если этот параметр включен, для обеспечения поведения изоляции READ_COMMITTED по умолчанию используется управление версиями строк вместо блокировки.
Когда эта опция включена, взимается определенная плата. На каждую строку приходится дополнительно 14 байтов плюс накладные расходы на поддержку хранилища версий строк в базе данных tempdb. Однако накладные расходы могут быть более чем компенсированы улучшениями параллелизма в зависимости от вашей рабочей нагрузки. Вам также необходимо убедиться, что приложения не запрограммированы так, чтобы полагаться на поведение блокировки по умолчанию.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.
with nolock
не заблокирует таблицу, но вы получите грязные данные. Я не уверен, что у вас может быть и то, и другое.