我想知道如果影响该表的唯一其他查询是 SELECT
查询,那么在该表上使用 SELECT WITH (NOLOCK)
有什么好处。
SQL Server 是如何处理的? SELECT
查询会阻止另一个 SELECT
查询吗?
我使用的是 SQL Server 2012 和 Linq-to-SQL DataContext
。
(编辑)
关于性能:
- 如果使用锁定的
SELECT
,第二个SELECT
是否必须等待第一个SELECT
完成? - 与
SELECT WITH (NOLOCK)
相比?
最佳答案
SQL Server 中的 SELECT
会在表行上放置共享锁 - 第二个 SELECT
也需要共享锁,并且这些是相互兼容的。
因此,一个 SELECT
无法阻止另一个 SELECT
。
WITH (NOLOCK)
查询提示的用途是能够读取正在插入(通过另一个连接)且尚未提交的数据。
如果没有该查询提示,SELECT
可能会被正在进行的 INSERT
(或 UPDATE
)语句(该语句放置了 < em>对行(或可能是整个表)进行排他锁定,直到该操作的事务被提交(或回滚)。
WITH (NOLOCK)
提示的问题是:您最终可能会读取根本不会插入的数据行(如果 INSERT
事务被回滚) - 所以你的例如报告可能会显示从未真正提交到数据库的数据。
还有另一个可能有用的查询提示 - WITH (READPAST)
。这指示 SELECT 命令跳过它尝试读取且被独占锁定的任何行。 SELECT
不会阻塞,也不会读取任何“脏”未提交的数据 - 但它可能会跳过一些行,例如不显示表中的所有行。
关于sql-server - 了解 SELECT 查询上的 SQL Server 锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12608780/