假设我已经打开 RCSI 并且我的服务器运行良好;资源使用量没有出现峰值,tempdb 上增加的负载也很小。这一切都很好,但我如何判断更改是否导致了我的用户问题?例如,为了查找由 RSCI 引起但读提交不会引起的问题,是否存在以下问题:
- 我可以跟踪的错误消息?
- 我可以运行诊断脚本吗?
- 需要关注的指标?
- 日志应用程序开发人员可以放入自己的代码吗?
- 我应该警惕哪些特定的用户投诉?
我很高兴使用 RCSI,但这个问题的目的是找到可行的方法来跟踪事后打开它的影响。
假设我已经打开 RCSI 并且我的服务器运行良好;资源使用量没有出现峰值,tempdb 上增加的负载也很小。这一切都很好,但我如何判断更改是否导致了我的用户问题?例如,为了查找由 RSCI 引起但读提交不会引起的问题,是否存在以下问题:
我很高兴使用 RCSI,但这个问题的目的是找到可行的方法来跟踪事后打开它的影响。
范围
这是一个很难回答和解释所有可能问题的问题,因为几乎每个工作负载都有需要特别注意的独特特征。有些可以使用乐观隔离级别完美运行,而另一些则需要在某些区域进行干预。
在大多数情况下,单个隔离级别并不是 100% 适用于任何工作负载,但开发人员的疏忽、天真等可能会导致使用不正确的隔离级别。这是否会导致任何问题通常取决于运气或缺乏并发性。
对于 RCSI,我遇到的唯一错误与版本存储空间填满/耗尽有关。您可以通过搜索可用的错误消息来了解要查找的内容:
如果您谈论快照隔离,您更关心的是更新冲突:
但这是完全不同的情况。
这取决于您尝试诊断的内容。最常见的是“什么在使用版本存储,使用了多少?”
这是sp_PressureDetector的代码片段,稍微重新格式化以尊重答案长度:
如果您使用的是 SQL Server 2017 或更高版本,您可以使用如下内容进行检查:
请注意,这些仅监视tempdb 中的版本存储大小。如果您使用 SQL Server 2019+ 并使用加速数据库恢复,您将需要监视持久版本存储。
除了版本存储大小之外,您可能还想使用版本存储查看长时间运行的事务。像这样的东西可能会给你足够的细节:
一般来说,您需要查找可能阻止版本存储清理的长时间运行的事务。
我想不出任何有用的东西。
您需要密切关注用户对不正确结果或重复条目的投诉。
在此尽量简明扼要,应用程序的某些区域可能对并发敏感,在这些区域中需要阻塞才能保证读提交锁定提供的结果正确性。
我建议查看 Paul White 的这些帖子中的示例:
特别是,当前使用读提交锁定作为隔离级别所保证的一致性的详细信息,以及数据修改如何在读提交快照隔离下获得奇怪的结果。对过时读取敏感的查询可以应用 READCOMMITTEDLOCK 提示,如序列表文章中所示。