ADO.net:为什么连接池没有使用已经打开的连接?

vlo*_*pel 3 c# sql-server ado.net transactions connection-pooling

此代码的预期行为是一个连接被打开.然后连接返回到连接池并在第二个open()上重用.对?

但是,当我对SQL Server 2005执行此代码时,第二个open()将事务转换为分布式事务.我从这一刻开始看到服务器上的2个连接.而第二个打开()大约需要3-4秒.从这一点开始,只使用了第二个.第一个连接似乎以某种方式被诅咒.

使用SQL Server 2008 R2时,只使用一个连接,如预期的那样.

有任何想法吗?谢谢!

using (var scope = new System.Transactions.TransactionScope())
{

    var constring = @"Server=xxx;Integrated Security=true;Connect Timeout=10;";

    using (var con = new SqlConnection(constring))
    {
        con.Open();
    }

    using (var con = new SqlConnection(constring))
    {
        con.Open();
    }

    scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 6

SQL Server 2005不存在"轻量级事务管理器"(LTM)支持 - 它不支持此类可升级事务,因此为了做出a所需的保证TransactionScope,它必须使用完整的"分布式事务"协调员"(DTC)交易 - 如果存在环境交易(TransactionScope),它必须立即执行.

当后端服务器支持可促销事务时,它允许LTM 不执行此操作,而是使用可在需要时提升为DTC 的LTM事务.在大多数情况下,哪个不会跨越一个单独的多个不同资源.TransactionScope

这意味着SQL Server 2005结合起来TransactionScope需要做更多的工作,从而产生这种结果.

由于SQL Server 2005的生命周期结束("扩展支持"结束)是2016年4月12日 - 这真的不应该伤害任何人今天.SQL Server 2008 R2将持续到2019年7月9日.