Страницы

Поиск по вопросам

четверг, 26 декабря 2019 г.

WITH NOLOCK зло?

#sql #sql_server


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

Однако на Хабре в статье "7 вещей, которые разработчик должен знать о SQL Server"
пишут, что во-первых WITH(NOLOCK) не гарантирует отсутствие блокировок, а во-вторых
 цитирую: 


  по поводу WITH NOLOCK. Поразило не то что будут блокировки, а то, что кто-то этой
анафемой не только всерьез пользуется, но еще и рассчитывает, что при этом не будет
блокировок


Вопрос: является ли злом использование WITH(NOLOCK)? Является ли это злом абсолютным
или же нет? Когда его использование может быть оправдано? 
    


Ответы

Ответ 1



WITH (NOLOCK) не является абсолютным злом. Это просто хинт. Зло - это использование его не по назначению. Надо просто точно представлять себе все последствия его применения - чтения строк, которые никогда не станут строками, фантомные чтения, возможные дубликаты одного и того же значения при сканах - чтобы понять, что в живом приложении его использовать не стоит. У NOLOCK/READ UNCOMMITTED есть одно явное предназначение - чтение невкомитанных данных. Мне, например, приходится им регулярно пользоваться при дебаге (в виде SET TRANSACTION ISOLATION LEVEL), когда код остановлен в середине транзакции, и надо выяснить что с точки зрения кода сейчас происходит в базе. Для всех остальных случаев, в которых раньше использовали NOLOCK/READ UNCOMMITTED, сейчас намного лучше подходит READ_COMMITTED_SNAPSHOT. P.S. А вот SNAPSHOT - это действительно зло!

Комментариев нет:

Отправить комментарий