SQL Server. Read Uncommitted, NOLOCK, Грязное чтение и прочее

SQL Server. Read Uncommitted, NOLOCK, Грязное чтение и прочее

Сегодня я бы хотел поговорить об уровне изоляции (Isolation Level) Read Uncommitted и подсказки NOLOCK. Подробнее о том, что такое уровень изоляции можно прочитать тут и тут.

Подсказка NOLOCK и уровень изолации Read Uncommitted действуют одинаково. Они являются наименьшим ограничением уровней изоляции.  Установка этих параметров позволяет считывать незафиксированные изменения, которые называются грязным чтением. Значения в данных могут быть изменены и до окончания транзакции строки могут появляться и исчезать в наборе данных.

Основное преимущество — это то, что мы накладываем только блокировку стабильности схемы (Sch-S), а это блокировка совместима с большинством других блокировок, тем самым мы не блокируем объекты и при этом сами можем читать данные из объектов заблокированных монопольно. Но в результате у нас появляется эффект грязного чтения…мы можем прочитать записи, которые ещё не зафиксированы и при последующем чтении этих данных может не оказаться в БД.

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

  1. Грязное чтение
  2. Возможность прочитать одну строку несколько раз
  3. Возможность получить не только больше, но и меньше строк
  4. Ошибка чтения данные при их перемещении

Так же хотелось бы описать несколько интересных моментов:

  1. Так как NOLOCK требует блокировку стабильности схемы (Sch-S), то любые её модификации приводят к блокировкам. Например создание индекса заблокирует чтение с помощью NOLOCK
  2. Так же NOLOCK накладывает блокировки на METADATA
Запись опубликована в рубрике Полезно и интересно с метками , , . Добавьте в закладки постоянную ссылку.

Добавить комментарий

Войти с помощью: