SQL Server 中的两个查询级别的Hint NOLOCK和ROWLOCK

NOLOCK

============

使用NOLOCK, 你会告诉SQL Server去忽略掉locks, 直接从表中读取数据. 这意味着你规避了SQL Server的锁系统, 会大幅度地提高性能和可扩展性.

然而, 既然你完全地绕过了锁系统, 也就意味着你的代码存在着读取了脏数据的风险. 你也许会读取到没有在一个transaction中被committed的不合法的数据. 这很危险.

ROWLOCK

============

使用ROWLOCK, 你会告诉SQL Server去仅仅使用row-level的lock. 在SELECT, UPDATE, 和DELETE语句中, 你可以使用这个关键字, 但是我仅在UPDATE和DELETE中使用它.

你也许会认为在你指定了primary key的UPDATE中, 必定会引发一个row lock. 但是当sql server得到一个有很多这样操作的批处理, 而这些条目中的一些不少都在一个page里的时候, 你有时候会看到一个page lock, 这样的话就会有问题发生了. 如果你不为update或者delete指定primary key, 那么数据库就没有理由不去假设很多其他东西不会受到影响, 所以, 它就直接使用page lock, 于是坏事情就发生了.

资料来源:

SQL Server Locks

http://www.cnblogs.com/awpatp/archive/2010/03/11/1683399.html

http://www.developerfusion.com/article/1688/sql-server-locks/4/

http://blogs.msdn.com/b/davidlean/archive/2009/04/06/sql-server-nolock-hint-other-poor-ideas.aspx

原文地址:https://www.cnblogs.com/vincentDr/p/3115049.html