此代码的预期行为将是打开一个连接。然后将连接返回到连接池中,并在第二个open()上重用。对吗?
但是,当我在 Server 2005上执行这段代码时,第二个open()将事务转换为一个分布式事务。我从这一刻就看到了服务器上的两个连接。第二个open()大约需要3-4秒。从现在开始,只使用第二种方法。第一种联系似乎在某种程度上被削弱了。
与预期一样, 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();
}发布于 2018-01-31 14:27:04
Server 2005不支持“轻量级事务管理器”(LTM) --它不支持这类可升级的事务,因此,为了提供TransactionScope所需的担保,它必须使用一个完整的“分布式事务协调器”(DTC)事务--如果存在环境事务(TransactionScope),它必须立即执行。
当后端服务器supoorts可促进事务时,它允许LTM不这样做,而是使用可以在需要时提升到DTC的LTM事务。在大多数情况下,在单个TransactionScope中不能跨越多个不同的资源,这将是“永远不会”的。
这意味着Server 2005与TransactionScope的结合必须做更多的工作,从而导致这种结果。
由于Server 2005的最终寿命(“扩展支持”结束)是2016年4月12日--这真的不应该伤害到今天的任何人。Server 2008 R2一直到2019年7月9日。
https://stackoverflow.com/questions/48544447
复制相似问题