【发布时间】:2016-07-16 02:02:33
【问题描述】:
我们发布了一个新的 sp,在测试期间我们发现它在运行时会阻塞其他 OLTP 事务。我们发现最初是因为新的 sp 导致表上的锁升级,我们减少了批量大小的数量并且能够避免这种情况。即使在避免锁升级之后,它仍然会阻止即将到来的 oltp 事务。 我认为它锁定了 oltp 事务正在更新的同一行。
我需要找到一种方法来跟踪新 sp 持有和释放的所有锁。我尝试了 trace/xevents(锁获取/释放),它看起来不像捕获所有锁,可能是因为它发生得太快了。
为了了解获取锁的样子,我通过 select * from atable 对其进行了测试。但它给了我不同的结果。当我们选择 * 时,它不会放置一系列页面锁,所以我应该在跟踪中看到共享页面锁。但我看到的只是获取和释放 IS 锁。
跟踪给定事务的所有锁的最佳方法是什么?
【问题讨论】:
-
扩展事件应该已经捕获了它。您可以使用会话定义更新您的帖子吗?
-
我认为您可以尝试在 REPEATABLE READ 隔离级别运行您的事务,并在事务提交前延迟半小时。一旦事务到达延迟语句,您可以通过查询 sys.dm_tran_locks 表来分析所占用的锁。由于事务隔离级别为 REPEATABLE READ,因此在事务提交之前不会释放任何锁。因此您将有半小时的时间来捕获所有占用的锁。
标签: sql-server database sql-server-performance