[英]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.