Сегодня я бы хотел поговорить об уровне изоляции (Isolation Level) Read Uncommitted и подсказки NOLOCK. Подробнее о том, что такое уровень изоляции можно прочитать тут и тут.
Подсказка NOLOCK и уровень изолации Read Uncommitted действуют одинаково. Они являются наименьшим ограничением уровней изоляции. Установка этих параметров позволяет считывать незафиксированные изменения, которые называются грязным чтением. Значения в данных могут быть изменены и до окончания транзакции строки могут появляться и исчезать в наборе данных.
Основное преимущество — это то, что мы накладываем только блокировку стабильности схемы (Sch-S), а это блокировка совместима с большинством других блокировок, тем самым мы не блокируем объекты и при этом сами можем читать данные из объектов заблокированных монопольно. Но в результате у нас появляется эффект грязного чтения…мы можем прочитать записи, которые ещё не зафиксированы и при последующем чтении этих данных может не оказаться в БД.
Грязное чтение не единственная проблема этих конструкций. Вот полный список и ссылки, где можно прочитать подробнее:
- Грязное чтение
- Возможность прочитать одну строку несколько раз
- Возможность получить не только больше, но и меньше строк
- Ошибка чтения данные при их перемещении
Так же хотелось бы описать несколько интересных моментов:
- Так как NOLOCK требует блокировку стабильности схемы (Sch-S), то любые её модификации приводят к блокировкам. Например создание индекса заблокирует чтение с помощью NOLOCK
- Так же NOLOCK накладывает блокировки на METADATA