正如barry已经解释的,这两个提示可以相互补充,但它们通常用于不同的上下文并解决不同的资源争用问题。
WITH (NOLOCK) 告诉服务器使用 READ UNCOMMITTED 事务隔离级别,这意味着您面临读取未提交(“脏”)行的风险,这些行可能随后被回滚,因此从未存在过。它确实可以防止经典的读取死锁,但会以获取无效数据为代价。
如果GetUser或CheckPassword操作有可能通过UpdateUser操作访问正在更新的用户的配置文件,则不建议使用 WITH (NOLOCK)。
WITH (ROWLOCK) 表提示可以与 SELECT、INSERT、UPDATE 和 DELETE 语句一起使用,以指示服务器仅对正在修改或添加的行应用 Range-Lock(s),并避免升级锁到页或表级别。其余行未锁定,可以由另一个查询访问。
但是,如果 SQL Server 上的默认事务隔离级别是 READ COMMITTED 或更严格,并且未启用 SNAPSHOT READS,则如果查找条件匹配或重叠,则活动的 INSERT、UPDATE 或 DELETE 事务可能仍会阻止 SELECT 查询。
当查询仅影响单个或仅几行时使用提示,以防止锁定锁定不会被查询删除的行。这将使另一个查询同时读取不相关的行,而不必等待删除完成。
如果您在将删除大量行的查询上使用它,它可能会降低性能,因为数据库将尝试避免将锁升级到更大的范围,即使它会更有效。