我在 Azure SQL 数据库中有一个聚集索引表。检查 dm_db_index_operational_stats 后,page_lock_wait_count列大于 0,表示之前发生过一些页面锁定,但没有记录row_lock_wait_count,如下图所示。
我尝试在 SQL Server 2019 中模拟这种情况。在我的测试数据库环境中将事务级别设置为“读取已提交快照”,与 Azure SQL 相同。但我只能遇到以下锁定情况。
- 开始事务 A,更新表 T 中的几行。开始事务 B,更新表中的类似行。事务 B 的等待锁资源类型是dm_tran_locks 中的KEY 。
- 开始事务 A,更新表 T 中的大量行。开始事务 B,也更新表的大量行。事务 B 的等待资源类型是 OBJECT,因为事务 A 持有 OBJECT 的 X 模式,我猜这是因为锁已经升级了。我在我的测试环境中多次尝试了上述场景。由于事务 A 会导致 Page IX 锁,因此 row_lock_count /row_lock_wait_count/page_lock_count会增加,但没有发生 page_lock_wait_count。
问题:
- 为什么当row_lock_wait_count=0时page_lock_wait_count可以大于0?
- 什么情况或者场景会引起页面锁等待?