see*_*san 19 sql-server syntax nolock
我见过使用nolock和(nolock)的sql语句,例如 -
select * from table1 nolock where column1 > 10
Run Code Online (Sandbox Code Playgroud)
和
select * from table1 with(nolock) where column1 > 10
Run Code Online (Sandbox Code Playgroud)
以上哪项陈述是正确的,为什么?
Phi*_*ley 30
第一个语句没有锁定任何东西,而第二个语句没有.刚刚我在SQL Server 2005上测试了这个
select * from table1 nolock where column1 > 10 --INCORRECT
Run Code Online (Sandbox Code Playgroud)
"nolock"成为table1中查询的别名.
select * from table1 with(nolock) where column1 > 10
Run Code Online (Sandbox Code Playgroud)
执行所需的nolock功能.持怀疑态度?在单独的窗口中,运行
BEGIN TRANSACTION
UPDATE tabl1
set SomeColumn = 'x' + SomeColumn
Run Code Online (Sandbox Code Playgroud)
锁定表,然后在自己的窗口中尝试每个锁定语句.第一个将挂起,等待锁被释放,第二个将立即运行(并显示"脏数据").别忘了发帖
ROLLBACK
Run Code Online (Sandbox Code Playgroud)
当你完成了.
Rem*_*anu 18
不推荐使用的功能列表位于SQL Server 2008中不推荐使用的数据库引擎功能:
- 在UPDATE或DELETE语句的FROM子句中指定NOLOCK或READUNCOMMITTED.
- 在不使用WITH关键字的情况下指定表提示.
- HOLDLOCK表提示没有括号
- 使用空格作为表提示之间的分隔符.
- 将表提示间接应用于通过视图调用多语句表值函数(TVF).
它们都在SQL下一个版本之后有时会删除的功能列表中,这意味着它们可能只在较低的数据库兼容级别下才能在enxt版本中得到支持.
据说我在这个问题上的2c是这样的:
from table nolock并from table with(nolock)就错了.如果您需要脏读,则应使用适当的事务隔离级别:set transaction isolation level read uncommitted.这种方式使用的相关级别是从一个'旋钮'明确陈述和控制,而不是通过源分散并受制于表提示的所有怪癖(通过视图和TVF等间接应用).脏读是一种不合理的行为.在99.99%的情况下,需要的是减少争用,而不是读取未提交的数据.通过针对设计良好的架构编写适当的查询来减少争用,并在必要时通过部署快照隔离来减少争用.解决工作的最佳解决方案几乎总能保存一些极端情况,即在数据库中启用读取提交的快照并让引擎发挥其魔力:
ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON
然后从选择中删除所有提示.