我正在尝试编写一些查询来从数据库中获取数据。我曾经使用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/