如果我传递事务中使用的连接作为参数(例如使用System.Transactions.TransactionScope
), SqlConnection.ClearPool
的行为是什么?
例如,在这个代码片段
中using(var tx=new System.Transactions.TransactionScope())
{
var sqlConn=new System.Data.SqlClient.SqlConnection(...);
/*do something with connection*/
System.Data.SqlClient.SqlConnection.ClearPool(sqlConn);
tx.Complete();
}
与ClearPool
调用我清除所有连接与相同的连接字符串(不管事务)或实际上我只关闭连接我传递(因为它是"关联"与事务)?
我在网上搜索,但我什么也没找到。从MSDN(这里和这里)可以清楚地看到没有交易的行为;此外,我明白,如果我在一个事务中,连接池试图给我之前在该事务中使用的连接(如果它仍然存在)。但是,我不清楚ClearPool
在事务中使用连接调用时的行为。
因为我没有找到关于这个特定场景的任何官方文档,所以我实现了一个模拟这个场景的小示例(可从https://github.com/edymtt/sqlclientconnectionpool获得)。在运行这个示例之前要做的重要事情是在测试机器上停止MS DTC——这样我们就不会处理分布式事务,也不会错过创建新的SqlConnection
。
通过这种方式,我发现SqlConnection.ClearPool
清除了所有具有作为参数传递的连接的相同连接字符串的连接,无论与该连接关联的任何事务。