首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么会导致睡眠会话具有打开的事务?

什么会导致睡眠会话具有打开的事务?
EN

Database Administration用户
提问于 2020-07-10 01:51:04
回答 1查看 744关注 0票数 3

对于我们的一个SQL服务器,有一个proc创建了阻塞混乱:

存储的proc在大多数情况下都会在一秒钟内完成,但不知何故,事务仍处于打开状态。我从sp_whoisactive中看到的是状态=睡眠并打开tran 1,持续时间约5-6分钟。在此期间,会出现起起阻塞链。

此SP没有像开始和结束TRAN这样的任何事务。它做了一些基本选择,col2,col3.从table1内部连接表2.然后从那个#temptable中选择

当我们从应用程序中检查为什么会有一个事务仍然处于打开状态时,我正在阅读这样的场景,以便在SP本身中使用XACT中止。但是当不涉及事务时,XACT中止设置在这种情况下会有什么帮助呢?

请指教

EN

回答 1

Database Administration用户

回答已采纳

发布于 2020-07-10 11:30:02

可能解释这些症状的情景包括:

  1. 应用程序代码已启动事务,但未提交。
  2. 应用SET IMPLICIT_TRANSACTIONS ON
  3. 存储过程包括SET IMPLICIT_TRANSACTIONS ON

此DMV查询将有助于故障排除。如果隐式启动,事务名称值将为"implicit_transaction“。其他可能的值包括"user_transaction“、"DTC事务”或用户指定的事务名称。"user_transaction“值(没有明确的proc事务)表示事务必须已在客户端启动,且未提交。"DTC事务“的值表示分布式事务,也表示应用程序端的事务管理问题。

代码语言:javascript
复制
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碰巧引发错误并最终回滚错误的事务。

票数 6
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/270708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档