WITH (NOLOCK) vs READ UNCOMMITTED: советы по оптимизации SQL

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

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

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

WITH (NOLOCK) получает основные различия при работе с конкретными таблицами. Это ваш выход, если важна скорость выполнения и нет строгой необходимости в точности данных. Ваш запрос будет выглядеть примерно так:

SELECT * FROM YourTable WITH (NOLOCK)

Когда же необходимо избежать блокировок на уровне всей сессии, используйте SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT * FROM YourTable

Соответственно, для операций непосредственно с таблицами выбирайте WITH (NOLOCK), а для работы на уровне сессии – SET... READ UNCOMMITTED. Однако, учтите, оба варианта могут при неосторожном использовании привести к нарушению целостности данных.

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

Выбор подхода: производительность и соблюдение целостности данных

Контроль над чтением данных

В отличие от WITH (NOLOCK), который применяется напрямую к таблице, READ UNCOMMITTED действует на всю сессию чтения данных.

Целостность данных как ключевой аспект

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

Баланс между производительностью и точностью

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

Альтернативные подходы

Использование уровней изоляции Snapshot и Serializable

Если актуальность и точность данных для вас на первом месте, подойдут SNAPSHOT или SERIALIZABLE. Эти уровни изоляции обеспечат стабильный набор данных, минуя "грязные" чтения. Но стоит учесть, что высокая точность может потребовать больше ресурсов для выполнения транзакций.

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
SELECT * FROM YourTable

MVCC как гарант стабильности чтения

Multiversion Concurrency Control (MVCC) в SQL Server позволяет осуществлять чтение данных без малейшего беспокойства об их изменении. Именно MVCC обеспечивает вам мгновенный снимок ситуации и безопасное чтение, независимо от параллельных процессов изменения данных.

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

Представим основные подходы к чтению в библиотеке:

Markdown
Скопировать код
Правило 1 (WITH (NOLOCK)): 🚶‍♂️💨
- Доступен к чтению любой материал, даже если он в процессе редактирования.
- Но будьте готовы к тому, что содержимое может измениться прямо во время чтения!

Правило 2 (READ UNCOMMITTED): 🧙‍♂️🔓
- Благодаря магии уровня изоляции, никаких блокировок на запись!
- Можно читать без спешки, но помните о возможных правках, которые могут изменить прочитанный текст.

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

Осторожно с NOLOCK при добавлении записей

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

Применение уровней изоляции в SQL

Заклинания в представлениях: такого стоит избегать

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

Переоценка NOLOCK

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

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

  1. SET TRANSACTION ISOLATION LEVEL (Transact-SQL) – SQL Server | Microsoft Learn — Официальная документация Microsoft на тему уровней изоляции транзакций в SQL Server.
  2. Избегайте использования NOLOCK в операциях UPDATE и DELETE в SQL Server — разъяснение того, почему NOLOCK не подходит для операций обновления и удаления.
  3. Различия между READ COMMITTED и READ UNCOMMITTED — подробное описание и сравнение двух популярных уровней изоляции, подход которых к чтению данных часто приводит к путанице из-за внешней схожести.