2014-02-18 40 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错误1205) –

回答

1

(NOLOCK)禁用共享锁而不是独占锁。 您可以使用读取提交隔离级别来为选择语句设置排它锁。

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

这会得到相同的错误 - '仅使用Select语句支持NoLock提示,不支持更新,插入和删除。' – GarethD

+0

对不起,我编辑了它。 –

0

NOLOCK是一个选择(只)暗示,这是太大的坏习惯形式年长程序员,因为它在SQL Server 7,但由于SQL Server 2000中它是最不必要几乎是强制性的。 这个提示特别告诉引擎,即使select处于一个uncommited事务的中间,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 

对我来说工作很好。