SQL Server中的表提示用于控制查询与数据、锁和优化器的交互。常见的表提示有NOLOCK(读取未提交数据)、UPDLOCK(获取更新锁)和HOLDLOCK(保持共享锁)。使用时需谨慎,以避免死锁和性能问题,尤其在动态工作负载下应避免硬编码提示。
本文介绍了一次程序卡死的故障排查过程,通过使用Windbg工具分析程序,发现是SQL查询导致的问题。通过观察所有线程栈,发现有两个线程在请求SQLSERVER,并在等待返回结果。进一步提取其中一个线程的SqlCommand对象,发现SQL语句没有加nolock导致在SQLSERVER层面一直获取不到S锁。通过观察SQL的请求时间,发现这条SQL已经等待了1分43秒,需要在SQLSERVER端查看锁相关的DMV视图,加上nolock尝试解决问题。最终朋友在SQLSERVER层面修改了max degree of parallelism来提高并发度,问题得到缓解。
一:背景 1. 讲故事相信绝大部分用 SQLSERVER 作为底层存储的程序员都知道 nolock 关键词,即使当时不知道也会在踩过若干阻塞坑之后果断的加上 nolock,但这玩意有什么注意事项呢?这就需要了解它的底层原理了。二:nolock 的原理 1. sql 阻塞还原为了方便讲述,先创建一个 post 表,插个 6 条记录,参考代码如下:CREATETABLEpost(idINTID...
完成下面两步后,将自动完成登录并继续当前操作。