Почему использование ЧТЕНИЕ ОТМЕНИЛО ФИКСАЦИЮ уровня изоляции?

Без обиняков, что является недостатками и преимуществами использования

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

в запросе для приложений.NET и создания отчетов о сервисных приложениях?

215
задан Michael Myers 22 September 2017 в 12:55
поделиться

3 ответа

Этот уровень изоляции допускает грязное чтение. Одна транзакция может видеть незафиксированные изменения, сделанные другой транзакцией.

Для поддержания наивысшего уровня изоляции СУБД обычно устанавливает блокировки данных, что может привести к потере параллелизма и высоким накладным расходам на блокировку. Этот уровень изоляции ослабляет это свойство.

Вы можете ознакомиться со статьей Википедии о ПРОЧИТАТЬ НЕПРЕРЫВНО , где есть несколько примеров и дальнейшее чтение.


Возможно, вас заинтересует статья Джеффа Этвуда о том, как он и его команда решали проблему тупика на заре Stack Overflow. По словам Джеффа:

Но опасен ли nolock ? Не могли бы вы завершить чтение недействительных данных включив чтение незафиксированных ? Да теоретически. Вы не найдете недостатка в базах данных астронавтов, которые начнут рассказывать о КИСЛОТАХ вам и всем , но включат пожарную сигнализацию здания, когда {{1} } вы говорите им, что хотите попробовать nolock . Это правда: теория пугает. Но вот что я думаю: «Теоретически нет разницы между теорией и практикой. На практике есть».

Я бы никогда не рекомендовал использовать nolock в качестве общего "полезного для того, что вас беспокоит" змеиное масло для исправления любых проблем с блокировкой базы данных, которые могут у вас возникнуть. Вы должны сначала попытаться диагностировать источник проблемы.

Но на практике добавление nolock к запросам, которые, как вы знаете, являются простыми и понятными только для чтения, никогда не приводит к проблемам ... Пока вы знаете, что делаете .

Одной из альтернатив уровня READ UNCOMMITTED , которую вы можете рассмотреть, является READ COMMITTED SNAPSHOT . Еще раз процитируем Джеффа:

Снимки полагаются на совершенно новый метод отслеживания изменений данных ... больше, чем просто небольшое логическое изменение, он требует, чтобы сервер обрабатывал данные физически по-другому. Как только этот новый метод отслеживания изменений данных включен, он создает копию или моментальный снимок каждого изменения данных. Благодаря чтению этих снимков, а не данных в реальном времени во время конкуренции, общие блокировки больше не нужны при чтении, и общая производительность базы данных может повыситься.

196
ответ дан 23 November 2019 в 04:21
поделиться

Это может быть полезно, чтобы увидеть ход выполнения длинных запросов вставки, сделать какие-либо приблизительные оценки (например, COUNT (*) или приблизительный SUM (* ) ) и т. Д.

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

35
ответ дан 23 November 2019 в 04:21
поделиться

Преимущество в том, что это может быть быстрее в некоторых ситуациях. Недостаток в том, что результат может быть неверным (могут быть возвращены данные, которые еще не были зафиксированы), и нет гарантии, что результат будет повторяемым.

Если вам важна точность, не используйте этот метод.

Более подробная информация на MSDN:

Реализует грязное чтение, или блокировку уровня изоляции 0, что означает, что не выдаются общие блокировки и не соблюдаются эксклюзивные блокировки. Когда эта опция установлена, можно читать незафиксированные или грязные данные; значения в данных могут быть изменены, а строки могут появляться или исчезать в наборе данных до завершения транзакции. Эта опция имеет тот же эффект, что и установка NOLOCK для всех таблиц во всех операторах SELECT в транзакции. Это наименее ограничительный из четырех уровней изоляции.

22
ответ дан 23 November 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: