2014-02-18 4 views
2

Я пытаюсь Погружает с (NOLOCK) на запросе обновления:запросов Обновление с NOLOCK намеком

UPDATE pth_patchLookup with(nolock) SET ScanDateTime = Getdate() WHERE RegID = 312 

, но я получаю следующее сообщение:

NoLock hint is supported only with Select statement and not with update, insert and delete. 

Есть ли способ, которым Я могу использовать «NOLOCK» на этот запрос обновления?

Спасибо за любую помощь

+2

Обычно '(NOLOCK)' обычно не то, что вы хотите ... есть побочные эффекты, которые могут вас удивить. 'READ COMMITTED SNAPSHOT ISOLATION' может сделать лучше, чтобы дать вам то, что вы (возможно) хотите, но для этого требуются изменения в базе данных. См. [Этот пост] (http://www.brentozar.com/isolation-levels-sql-server/) для получения дополнительной информации. – bhamby

+0

Что вы пытаетесь достичь? – GarethD

+0

@GarethD Существует ошибка тупика (SQL Error 1205), когда есть несколько экземпляров, обновляющих таблицу. –

ответ

1

(NOLOCK) отключает общие блокировки, а не эксклюзивные блокировки. вы можете использовать уровень изоляции Read Committed, чтобы разместить эксклюзивную блокировку для выбранных операторов.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
UPDATE pth_patchLookup SET ScanDateTime = Getdate() WHERE RegID = 312 
+2

Это приведет к той же ошибке - «Совет NoLock поддерживается только с помощью инструкции Select, а не с обновлением, вставкой и удалением». – GarethD

+0

Извините, я отредактировал его. –

0

NOLOCK является выбор (только) намек, и это очень плохая привычка форма старше программистов, так как это было почти обязательным в SQL Server 7, но так как SQL Server 2000 это самый ненужный. Этот намек, в частности, указывает движку, что select может читать строки, даже если он находится в середине незавершенной транзакции. Из-за этого вы можете испытывать грязные или призрачные чтения.

Я настоятельно рекомендую вам ознакомиться с уровнями изоляции, чтобы узнать, как удовлетворить ваши конкретные системные требования.

0

И это?

UPDATE TOP (1000) v 
SET idSupervisor = a.supervisor 
FROM dbo.Venda_2014 v WITH (NOLOCK) 
INNER JOIN #supervidores_presentes a WITH (NOLOCK) ON v.IdVendedor = a.vendedor AND v.idEmpresaOriginal = a.empresa 
WHERE IdDistribuidor IN (40) 
     AND ISNULL(v.idSupervisor,0) = 0 
     AND datAnoMesRef >= '201501' 
Go 

Рабочие штрафы за меня.

Смежные вопросы