Мне нужно написать оператор выбора sql без создания каких-либо блокировок в таблицах, но прочитать зафиксированные записи.

Может кто-нибудь поможет, пожалуйста ...

0
user3561257 15 Окт 2014 в 00:32
with nolock не заблокирует таблицу, но вы получите грязные данные. Я не уверен, что у вас может быть и то, и другое.
 – 
crthompson
15 Окт 2014 в 00:33
Я думаю, это противоречие. Никакие блокировки не дадут вам все записи, зафиксированные или иные.
 – 
Andrew
15 Окт 2014 в 00:34
Я хочу читать зафиксированные записи, но без блокировки каких-либо таблиц
 – 
user3561257
15 Окт 2014 в 00:35
1
У вас не может быть и того, и другого. Если вы хотите читать только зафиксированные записи, вам нужно заблокировать таблицу. Кроме того, если вы хотите убедиться, что полученные записи согласуются друг с другом (т. е. все они были в таблице вместе в какой-то момент времени), вам необходимо заблокировать таблицу. Однако вам может не понадобиться явно это делать, в зависимости от настроенного уровня изоляции транзакций.
 – 
John Bollinger
15 Окт 2014 в 00:36
Также обратите внимание, что даже блокировка таблицы не мешает вам читать незафиксированные записи, которые были созданы или изменены ранее в той же транзакции, которая выполняет чтение.
 – 
John Bollinger
15 Окт 2014 в 00:40

2 ответа

Лучший ответ

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

И когда пользователь изменяет строку, он получает эксклюзивную блокировку ресурсов. Эксклюзивная блокировка означает, что никто другой не может получить доступ к данным во время их изменения. Он заблокирован исключительно этим пользователем.

Следовательно, мораль этой истории - придерживаться уровня изоляции транзакций по умолчанию Read Committed, и он получит блокировку (разделяемую блокировку) на строку перед ее извлечением, чтобы избежать грязного чтения.

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

1
M.Ali 15 Окт 2014 в 00:46

Вы можете включить опцию базы данных READ_COMMITTED_SNAPSHOT. Если этот параметр включен, для обеспечения поведения изоляции READ_COMMITTED по умолчанию используется управление версиями строк вместо блокировки.

Когда эта опция включена, взимается определенная плата. На каждую строку приходится дополнительно 14 байтов плюс накладные расходы на поддержку хранилища версий строк в базе данных tempdb. Однако накладные расходы могут быть более чем компенсированы улучшениями параллелизма в зависимости от вашей рабочей нагрузки. Вам также необходимо убедиться, что приложения не запрограммированы так, чтобы полагаться на поведение блокировки по умолчанию.

0
Dan Guzman 15 Окт 2014 в 03:08