Зачем использовать уровень изоляции READ UNCOMMITTED?


на простом английском языке, каковы недостатки и преимущества использования

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

в запросе для приложений .NET и приложений служб reporting services?

10 201

10 ответов:

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

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

вы можете проверить статья в Википедии о READ UNCOMMITTED для нескольких примеров и далее чтение.


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

но nolock опасно? не могли бы вы закончить до чтения недопустимых данных с read uncommitted о? Да, в теории. Вы не найти недостатка в базе данных архитектура космонавты, которые начинают капля кислотной науки на вас и всех но вытяните пожарную сигнализацию здания когда вы говорите им, что хотите попробовать nolock. Это правда: теория страшная. Но вот что я думаю: "в теории есть никакой разницы между теорией и практиковать. На практике есть."

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

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

одна альтернатива READ UNCOMMITTED уровень, который вы можете рассмотреть это READ COMMITTED SNAPSHOT. Снова цитируя Джеффа:

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

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

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

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

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

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

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

Если вы заботитесь о точности, не используйте это.

дополнительная информация находится на MSDN:

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

когда это нормально использовать READ UNCOMMITTED?

правило

хороший: большие сводные отчеты, показывающие постоянно меняющиеся итоги.

рискованные: почти все остальное.

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

Подробнее...

ОК, чтобы использовать его:

  • почти все обращенные к пользователю агрегированные отчеты для текущих, нестатических данных, например, год до даты продаж. Он рискует погрешностью (возможно,

это охватывает, вероятно, большую часть того, что отдел бизнес-аналитики будет делать, скажем, в SSRS. Исключением, конечно, является все, что имеет знаки $ перед ним. Многие люди рассчитывают на деньги с помощью гораздо больше рвения, чем применяется к соответствующим основным метрикам, необходимым для обслуживания клиента и получения этих денег. (Я обвиняю бухгалтеров).

когда рискованные

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

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

  • почти все, что кормит приложение, которое также пишут способности.

когда даже ОК сценарий не в порядке.

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

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

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

также интересно отметить, что не происходит. Read UNCOMMITTED не только игнорирует другие блокировки таблиц. Это также не вызывает никаких блокировок в своих собственных.

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

Если вы используете READ UNCOMMITTED, вы не будете устанавливать общую блокировку в таблице. Вы можете получить результат из некоторых новых транзакций или вы можете не зависеть от того, где именно в таблицу были вставлены данные и как долго ваша выбранная транзакция прочитала. Вы также можете получить одни и те же данные дважды, если, например, происходит разделение страницы (данные будут скопированы в другое место в файле данных).

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

лучший способ вообще может быть использовать уровень изоляции моментального снимка, но ваши приложения могут потребоваться некоторые корректировки, чтобы использовать это. Одним из примеров этого является то, что ваше приложение принимает монопольную блокировку строки, чтобы предотвратить ее чтение другими и перейти в режим редактирования в пользовательском интерфейсе. СНИМОК Уровень изоляции также поставляется со значительным снижением производительности (особенно на диске). Но вы можете преодолеть это, бросив аппаратное обеспечение на проблему. :)

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

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

  • при чтении исторических данных. например, некоторые журналы развертывания, которые произошли два дня назад.
  • при повторном чтении метаданных. например, приложение на основе метаданных.

Не используйте READ_UNCOMMITTED, когда вы знаете, что souce может измениться во время операции выборки.

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

Я всегда использую READ UNCOMMITTED now. Это быстро с наименьшими проблемами. При использовании других изоляций вы почти всегда столкнетесь с некоторыми проблемами блокировки.

пока вы используете поля автоматического приращения и уделяете немного больше внимания вставкам, то ваш штраф, и вы можете попрощаться с проблемами блокировки.

вы можете сделать ошибки с READ UNCOMMITED но, честно говоря, это очень легко убедитесь, что ваши вставки являются полным доказательством. Вставки/обновления, которые используют результаты выбор-это единственное, что вам нужно следить. (Используйте Read COMMITTED здесь или убедитесь, что грязные чтения не вызовут проблем)

Так идут грязные чтения (специально для больших отчетов), ваше программное обеспечение будет работать более плавно...