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

你可以使用这两个query-level的hint来告诉SQL Server你希望如何处理locking.

 

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.developerfusion.com/article/1688/sql-server-locks/4/

posted on 2010-03-11 13:43  中道学友  阅读(2331)  评论(0编辑  收藏  举报

导航

技术追求准确,态度积极向上