Различия между NOLOCK и READUNCOMMITTED в SQL Server

Пройдите тест, узнайте какой профессии подходите

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

Быстрый ответ

В SQL Server подсказки NOLOCK и READ UNCOMMITTED выполняют аналогичные функции. С их помощью запрос может игнорировать стандартные блокировки и работать с неподтвержденными данными. Это может ускорить выполнение запроса, однако увеличивает вероятность использования некорректных данных из-за возможности "грязного чтения".

SQL
Скопировать код
-- Быстрое чтение: какие правила здесь работают?
SELECT * FROM Employees WITH (NOLOCK)

Вышеуказанный синтаксис позволяет извлекать из таблицы Employees данные, утверждение которых еще не подтверждено.

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

Кинга Идем в IT: пошаговый план для смены профессии

Влияние блокировок в действии

Подсказки NOLOCK и READ UNCOMMITTED изменяют стратегию блокировок в SQL Server:

  • NOLOCK применяется непосредственно к таблице и действует только в рамках одного запроса.
  • READ UNCOMMITTED, используемый как уровень изоляции, влияет на все запросы в рамках соответствующей транзакции.

Использование этих подсказок может вызвать следующие артефакты:

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

Альтернативы и лучшие практики

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

Прежде чем применять их, проанализируйте ситуацию:

  • Критичность транзакции: используйте эти подсказки только тогда, когда это приемлемо, например, для фоновых процессов или выгрузки отчетов.
  • Альтернативы: рассмотрите другие варианты блокировки, такие как уровень изоляции SNAPSHOT, который позволяет избежать грязного чтения.
  • Уровень изоляции: ориентируйтесь на строгие уровни изоляции, такие как REPEATABLE READ или SERIALIZABLE, обеспечивающие наиболее высокую надежность данных.

Визуализация

NOLOCK и READ UNCOMMITTED можно представить как два туннеля:

Markdown
Скопировать код
Туннель 🚇: [🚫🔒] NOLOCK
Туннель 🚇: [⛏️] UNCOMMITTED

С помощью NOLOCK запрос получает доступ к неокончательным данным. Это как прочитать черновик, который ещё не был отредактирован.

Markdown
Скопировать код
🚂💨🚫🔒: [👀🏗️] Этому поезду без разницы реалии – главное быстро доехать!

UNCOMMITTED также предоставляет возможность работать с "сырыми" данными:

Markdown
Скопировать код
🚂💨⛏️: [👀🔄] Даже если строится, разрешён вход. 🚧⚠️

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

Где использовать с осторожностью

Мыслями и стратегическим подходом, NOLOCK и READ UNCOMMITTED могут быть полезными:

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

Полезные материалы

  1. Установка уровня изоляции транзакции (Transact-SQL) – SQL Server — официальная документация Microsoft с подробным описанием уровней изоляции транзакций, в том числе READ UNCOMMITTED.
  2. Зачем требуется откат при использовании sp_addextendedproperty в хранимой процедуре? – Database Administrators Stack Exchange — обсуждение влияния NOLOCK и его скрытых проблем.
  3. Свойства входа (Общая страница) — публикация, дающая полное понимание уровней изоляции транзакций и их влиянии.