sql-server - 我是否仍应在 SQL Server 查询中使用 With(NoLock)?

标签 sql-server

我正在尝试编写一些查询来从数据库中获取数据。我曾经使用With(NoLock)来防止SQL Server在数据库上放置共享锁。最近我的一个 friend 告诉我,现在的默认行为是它不会对读取数据设置任何锁定。

但是,我找不到对此的明确解释。 我还应该在 SQL Server 中使用 With(NoLock) 吗?

最佳答案

WITH (NOLOCK) 的行为与将事务隔离级别设置为 READ UNCOMMITTED 的行为相同,只是其范围不同。

但是,请记住,SQL Server 可以根据您运行的查询类型使用不同的隔离级别。 (INSERT、UPDATE、DELETE 和其他写入操作必须至少在 READ COMMITTED 下运行)。

你的 friend 说得不对,SQL Server在对表进行读操作时至少会获取一个模式锁,以防止表结构发生改变。即使您使用 READ UNCOMMITTED 隔离级别或 WITH (NOLOCK) 提示,此锁也会应用于表。

一般来说,我会避免使用 WITH (NOLOCK) 提示。使用表提示时您的控制权较少。如果可接受脏读,请对连接使用 READ UNCOMMITTED 隔离级别。

您始终可以更改连接的隔离级别,但无法动态删除 WITH (NOLOCK) 提示。当您在每个表上使用 WITH (NOLOCK) 时尤其如此。

关于sql-server - 我是否仍应在 SQL Server 查询中使用 With(NoLock)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47766945/

相关文章:

sql - 将 .bacpac 从一个 Azure SQL Server 还原到另一个 Azure SQL Server 后,包含的用户密码和登录用户密码不起作用

sql-server - 连接字符串中未遵守超时

sql - SQL Server 中的 INNER JOIN 与 LEFT JOIN 性能

c# - 如何在 Gridview 中进行数据绑定(bind)?

sql - 使用查询sql连接3个表

asp.net - LocalSystem 与 System 与 Local System Windows 系统帐户

SQL Server - 在列中显示用户名

sql-server - ARITHABORT OFF 对性能产生不利影响

sql - 设置日期表达式格式的最佳位置。 SSRS 端还是 SQL Server 端?

SQL 查询查找过去的第 3 个工作日,不包括节假日和周末