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

3
使用这段代码的预期行为是打开一个连接,然后将该连接返回到连接池中并在第二个open()调用时重复使用。对吧?
但是当我对SQL Server 2005执行此代码时,第二个open()会将事务转换为分布式事务。从那时起,服务器上就会出现两个连接。而第二个open()需要大约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();
}
1个回答

6
"轻量级事务管理器"(LTM)不支持SQL Server 2005,它不支持此类可晋升事务,因此为了满足TransactionScope所需的保证,它必须使用完整的“分布式事务协调器”(DTC)事务,并且如果有环境事务(TransactionScope)存在,则必须立即执行。
当后端服务器支持可晋升事务时,它允许LTM不这样做,而是使用可以在需要时晋升到DTC的LTM事务。大多数情况下不会跨越单个TransactionScope中的多个不同资源,因此从未晋升。
这意味着SQL Server 2005结合TransactionScope需要做更多的工作,导致这种结果。
由于SQL Server 2005的生命周期已结束(扩展支持结束),截止日期为2016年4月12日,因此今天不应该影响任何人。SQL Server 2008 R2则延长至2019年7月9日。"

嗨Marc,谢谢你的回答。我读了关于LTM和事务促进的文章。如果我理解正确的话,你的回答解释了为什么事务会因为打开第二个连接而被提升。但是为什么会打开第二个连接呢?为什么不使用第一个连接呢?谢谢! - vlopel
@vlopel我只有“因为原因” - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接