#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 - это действительно зло!
Комментариев нет:
Отправить комментарий