繁体   English   中英

在嵌套事务作用域中打开两个SQL连接时挂起事务

[英]Hanging transaction when open two SQL connections in nested transaction scopes

我试图了解以下代码中的错误:

using (var scope1 = new TransactionScope())
{
    var connection1 = new SqlConnection("...");
    connection1.Open();

    using (var scope2 = new TransactionScope())
    {

        SqlConnection connection2 = new SqlConnection("...");
        connection2.Open();

        connection2.Close();
        scope2.Complete();

    }

    connection1.Close();
    scope1.Complete();
}

一个应用程序非常复杂,因此存在TransactionScope嵌套块。 在上面的代码中,打开连接后,由于在SQL Server中创建了事务,因此实际上创建了两个事务,因为该连接被打开了两次。

我通过调用以下SQL语句进行了检查:

SELECT * FROM sys.sysprocesses WHERE open_tran = 1

当scope1中的环境事务完成时,数据库中仍然有一个事务。 connection2.Close()创建的事务仍在挂起。 我的问题是为什么该事务仍然存在以及如何更正代码。

编辑:

我猜想使用在TransactionScope外部定义的一个SQL连接可能是一个答案,但也许存在更好的方法?

该代码将需要分布式事务,因为您同时打开了两个单独的SqlConnection对象。 如果在启动第二个TransactionScope之前关闭SqlConnection,则将重新使用初始连接和事务,并且不需要DTC事务。

无论如何,我认为这是进行DTC交易的无害副作用,其跟踪方式有所不同。 校验

  select st.session_id, is_local, is_enlisted, at.transaction_state
  from sys.dm_tran_session_transactions st
  join sys.dm_tran_active_transactions at
    on at.transaction_id = st.transaction_id 

对于我来说,它为打开的第二个会话输出一行(spid 65),并指示事务已提交。

session_id  is_local is_enlisted transaction_state
----------- -------- ----------- -----------------
65          0        1           6

transaction_state = 6表示事务已提交。 https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-tran-active-transactions-transact-sql?view=sql-server-2017

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM