我一直遇到死锁问题。该应用程序有超过1000个表,平均用户数为100。 当我使用此查询检查锁升级类型时,所有表都使用“TABLE”
SELECT lock_escalation_desc FROM sys.tables
这是默认行为吗?没有ROW或PAGE? 我在另一台服务器上检查了另一个应用程序,所有表格也都是“TABLE”。
感谢。
答案 0 :(得分:1)
是的,这是默认的升级级别,非常正常。
也许您对升级是什么感到困惑?这是一旦SQL Server在较低级别持有过多锁并因性能和资源原因合并它们时会发生的情况。
您需要检查allow_row_locks
中的allow_page_locks
和sys.indexes
,看看是否存在阻止这些较低级锁定的配置问题。
w.r.t。升级级别本身,如果你使用分区表,那么你可以考虑AUTO
来避免锁定整个事情。但这不是默认的原因是因为对于常见的工作负载而言,这更容易导致死锁。
锁永远不会从一行升级到另一页。它总是从行或页面到至少整个分区级别。
你应该首先调查你看到锁升级的原因(如果你确实如此)。在读提交隔离级别下,典型行为是选择查询获取行锁并在读取数据后立即释放它们。
您是否在不必要的限制隔离级别运行?这些升级是否发生在可以分解为较小批次的数据修改语句中?