对于我们的一个SQL服务器,有一个proc创建了阻塞混乱:
存储的proc在大多数情况下都会在一秒钟内完成,但不知何故,事务仍处于打开状态。我从sp_whoisactive中看到的是状态=睡眠并打开tran 1,持续时间约5-6分钟。在此期间,会出现起起阻塞链。
此SP没有像开始和结束TRAN这样的任何事务。它做了一些基本选择,col2,col3.从table1内部连接表2.然后从那个#temptable中选择
当我们从应用程序中检查为什么会有一个事务仍然处于打开状态时,我正在阅读这样的场景,以便在SP本身中使用XACT中止。但是当不涉及事务时,XACT中止设置在这种情况下会有什么帮助呢?
请指教
发布于 2020-07-10 11:30:02
可能解释这些症状的情景包括:
SET IMPLICIT_TRANSACTIONS ONSET IMPLICIT_TRANSACTIONS ON。此DMV查询将有助于故障排除。如果隐式启动,事务名称值将为"implicit_transaction“。其他可能的值包括"user_transaction“、"DTC事务”或用户指定的事务名称。"user_transaction“值(没有明确的proc事务)表示事务必须已在客户端启动,且未提交。"DTC事务“的值表示分布式事务,也表示应用程序端的事务管理问题。
SELECT
session_tran.session_id
, active_tran.name
FROM sys.dm_tran_session_transactions AS session_tran
INNER JOIN sys.dm_tran_active_transactions AS active_tran ON session_tran.transaction_id = active_tran.transaction_id;在存储过程中包含SET XACT_ABORT ON以确保事务被回滚,尤其是在客户端超时之后,这是一种很好的做法。这在这里可能没有帮助,因为proc没有明确的事务,除非proc碰巧引发错误并最终回滚错误的事务。
https://dba.stackexchange.com/questions/270708
复制相似问题