我见过使用nolock和with(nolock)的sql语句,例如-
select * from table1 nolock where column1 > 10和
select * from table1 with(nolock) where column1 > 10以上哪一项陈述是正确的?为什么?
发布于 2009-11-13 01:37:15
第一条语句没有锁定任何内容,而第二条语句锁定了任何内容。当我刚刚在SQL Server 2005上进行测试时,在
select * from table1 nolock where column1 > 10 --INCORRECT在该查询中,"nolock“成为table1的别名。
select * from table1 with(nolock) where column1 > 10执行所需的nolock功能。持怀疑态度?在单独的窗口中,运行
BEGIN TRANSACTION
UPDATE tabl1
set SomeColumn = 'x' + SomeColumn来锁定表,然后在各自的窗口中尝试每条锁定语句。第一个将挂起,等待锁被释放,第二个将立即运行(并显示“脏数据”)。别忘了发布
ROLLBACK当你完成的时候。
发布于 2009-11-13 02:01:04
不推荐使用的功能列表位于Deprecated Database Engine Features in SQL Server 2008
它们都在下一版SQL之后有时会被删除的特性列表中,这意味着只有在较低的数据库兼容级别下才能在enxt版本中支持它们。
话虽如此,我对这个问题的看法是这样的:
from table nolock和from table with(nolock)都是错的。如果你需要脏读,你应该使用适当的transaction isolation级别:set transaction isolation level read uncommitted。通过这种方式,使用的立法级别被明确地声明并从一个“旋钮”控制,而不是通过源散布,并受制于表提示的所有怪癖(通过视图和TVF等间接应用)。ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON
然后删除selects中的所有提示。
发布于 2009-11-13 01:23:45
它们在技术上都是正确的,但是从SQL2005开始,所以习惯使用not using the WITH keyword has been deprecated关键字--简短的回答,使用WITH关键字。
https://stackoverflow.com/questions/1723910
复制相似问题