gpt4 book ai didi

sql-server - SQL Server 2008 中表的 WITH (NOLOCK)

转载 作者:行者123 更新时间:2023-12-03 09:51:48 25 4
gpt4 key购买 nike

在我的 SQL tempOrder 表中有数百万条记录,并且有 10 个触发器用另一个表的更新来更新 tempOrder 表。

所以我想在表上应用 apply with(NOLOCK)

我知道

SELECT * FROM temporder with(NOLOCK)

这个语句我可以做到。但是有什么方法可以将 with(NOLOCK) 直接应用于 SQL Server 2008 中的表。

最佳答案

您的问题的直接答案是否定的——没有选项可以告诉 SQL 永远不要锁定 tableX。话虽如此,您的问题开启了一系列应该提出的问题。

隔离级别

首先,您可以完成所需操作的最直接方法是使用 with (nolock) 选项或 SET TRANSACTION ISLOATION LEVEL READ UNCOMMITTED(也称为困惑)。这些选项分别适用于查询或连接持续时间。如果我选择这条路线,我会将它与长时间运行的 SQL Profiler 跟踪相结合,以识别锁定 TableX 的任何查询。

锁定升级

其次,SQL Server 确实有一个表范围的 LOCK_ESCALATION 阈值(作为 ALTER TABLE SET LOCK_ESCALATION x 执行,其中 X 是锁的数量或 AUTO)。这控制了 SQL 何时尝试将许多细粒度锁合并为较少的粗粒度锁。换句话说,它是一个数字阈值,用于转换在单个数据库对象(想想索引)上取出多少锁。

覆盖 SQL 的锁升级通常不是一个好主意。作为documentation states :

In most cases, the Database Engine delivers the best performance when operating with its default settings for locking and lock escalation.

尽管看起来有悖于直觉,但从您描述的场景来看,您可能有一些运气,使用更少的宽锁而不是 NOLOCK。您需要用实际工作量 来检验这个理论,以确定它是否值得。

快照隔离

您还可以查看 SNAPSHOT 隔离级别。您的问题中没有足够的信息可以知道,但我想这会有所帮助。

NOLOCK 的危险

话虽如此,您可能已经从@GSerg 的评论中了解到,NOLOCK 可能是邪恶的。 No-Lock 通俗地称为混沌——这是有充分理由的。当开发人员第一次遇到 NOLOCK 时,似乎允许脏读 是唯一的暗示。还有更多……

  • 为不一致的结果读取脏数据(普遍印象)
  • 错误 数据 -- 表示与数据的写入前或写入后状态都不一致。
  • 终止查询的硬异常(如由于数据移动导致的错误 601)
  • 返回空白数据
  • 丢失了之前提交的行
  • 返回格式错误的字节

但不要相信我的话:

关于sql-server - SQL Server 2008 中表的 WITH (NOLOCK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9464394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com