Лучшая альтернатива WITH (NOLOCK)?

Я создаю собственный проект на C # .Net, используя трехуровневое приложение, я не хочу делать свои операторы sql транзакционными, эти операторы используются в нескольких хранимых процедурах, я использовал WITH (NOLOCK) подход для запроса тех таблиц, которые использовались для вставок или обновлений во время транзакции, а на стороне C # я использовал TransactionScope, но недавно я прочитал, что использование WITH (NOLOCK) не рекомендуется, потому что это может привести к фантомному читает или использует грязные и противоречивые данные. Мой вопрос заключается в том, чтобы использовать данные, которые были вставлены или обновлены во время транзакции, когда дело доходит до выбора, какой подход является наилучшим с точки зрения транзакционных операций?, Будь то сторона базы данных или сторона бизнес-кода.


person jecarfor    schedule 05.10.2015    source источник
comment
Я думаю, что лучше спросить об этом в сообществе администраторов баз данных, если вы хотите исчерпывающий ответ. dba.stackexchange.com   -  person Evaldas Buinauskas    schedule 05.10.2015
comment
Лучшая альтернатива - просто удалить его. Любое перемещение данных внутри транзакции по-прежнему видно в этой транзакции.   -  person Sean Lange    schedule 05.10.2015
comment
Рассмотрите возможность использования изоляции моментальных снимков, если чтение без ожидания критично для вас; но у него есть собственный мешок с червями, так что сначала постарайтесь его исследовать.   -  person Cory Nelson    schedule 05.10.2015


Ответы (3)


Рассматривали ли вы изоляцию моментальных снимков? Он обеспечивает идеальную согласованность чтения и вообще не блокирует данные.

SI является стандартным для многих СУБД и по умолчанию включен. Не понимаю, почему люди, использующие SQL Server, не решаются его использовать. Недостатки незначительны, но их необходимо изучить.

person usr    schedule 05.10.2015

Вам это просто не нужно. Если вы измените некоторые данные и позже запросите их в той же транзакции, вы получите измененные данные.

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

Если вы укажете WITH (NOLOCK), вы разрешите вашему запросу игнорировать эксклюзивные блокировки от ДРУГИХ транзакций. Это приведет к тому, что ваши запросы будут возвращать неверные данные.

person Jakub Lortz    schedule 05.10.2015

Может быть, вы не знаете, чего хотите.

WITH (NOLOCK) возвращает грязные и противоречивые данные.

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

person Sergio Internicola    schedule 05.10.2015