sql-server - 了解 SELECT 查询上的 SQL Server 锁

标签 sql-server tsql linq-to-sql

我想知道如果影响该表的唯一其他查询是 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/

相关文章:

c# - LINQ to SQL 如何知道委托(delegate)中有什么?

sql - Azure SQL 数据库中的索引

sql - 计算两次手机充值之间的平均值

sql - TSQL 根据最大​​的其他列的组合检索最大行

c# - 如何从可能为空的 SQL Server 中安全地读取字符串值?

c# - linq 从存在任何列表值的查询中删除项目

sql-server - 在 MS SQL Server 2005 中使用 Rails 2.x

sql-server - SQL Server SQLCMD 命名实例登录超时已过期

sql - TSQL - 如何查找列是否有空格 char(32)?

winforms - 通过 Web 服务发送 Linq to SQL 类