对于我们的一个 SQL 服务器,有一个 proc 会造成阻塞:
该存储过程在大多数情况下会在一秒钟内完成,但不知何故使事务处于打开状态。我从 sp_whoisactive 看到的是 status = sleep 并打开 tran 1 持续约 5-6 分钟。在此期间,出现了起伏的阻塞链。
该 SP 没有任何事务,如 BEGIN 和 END TRAN。它做了一些基本的 select col,col2,col3.... into #temptables from table1 inner join table 2 ... 然后从中选择 #temptable
当我们从应用程序检查为什么可能有一个事务处于打开状态时,我正在阅读在这种情况下以在 SP 本身中使用 XACT ABORT ON。但是当不涉及事务时,XACT ABORT 设置在这种情况下将如何帮助?
请指教
可以解释这些症状的情景包括:
应用程序代码已启动事务但未提交
应用程序
SET IMPLICIT_TRANSACTIONS ON
存储过程包括
SET IMPLICIT_TRANSACTIONS ON
此 DMV 查询将有助于故障排除。如果隐式启动,事务名称值将是“implicit_transaction”。其他可能的值包括“user_transaction”、“DTC Transaction”或用户指定的事务名称。“user_transaction”值(没有显式 proc 事务)表示事务必须已在客户端启动且未提交。“DTC Transaction”的值表示分布式事务,也表示应用端的事务管理存在问题。
SET XACT_ABORT ON
在存储过程中包含显式事务以确保事务回滚是一种很好的做法,尤其是在客户端超时之后。这可能在这里无济于事,因为您的 proc 没有显式事务,除非 proc 碰巧引发错误并回滚错误的事务作为结果。