是什么促使 SQL Server 决定使用哪个锁级别(行锁、页锁或表锁?)


What makes SQL Server decide what lock level to use (row, page or table lock?)

SQL Server有很多锁定资源的方法。我试图了解是什么让SQL Server选择它将选择的锁级别。我想知道它什么时候会使用页面或表格锁定而不是行锁定?

问题

我有一个PHP应用程序,它在每个http请求中使用事务,以确保在提交之前执行所有查询。让我感到困惑的一个问题是,当许多 (5+) 人使用该应用程序似乎挂起的应用程序(长时间旋转)时!除了数据库锁之外,我想不出任何东西会导致这种行为!我认为这种情况是SQL Server出于某种原因选择页面或表锁定而不是行锁定。我正在尝试确保SQL Server正在执行行锁定而不是页面或表锁定。我正在使用 ORM,所以我不能在我的查询中使用 ROWLOCK 提示。

有没有办法让我运行查询解释计划以查看将使用的锁定级别?

正如您在此处看到的,锁定模式下没有默认粒度。

通常,优化程序会选择最佳操作方案来处理此问题。

可能是由于长时间运行的事务而导致资源匮乏而导致的活锁情况吗?

您也可以在此处和此处查看有关锁定升级的信息,但我建议不要为任何表禁用它。