1

SqlConnection.ClearPoolトランザクション内で使用される接続を引数として渡す場合(たとえば、を使用する場合)の動作はどうなりSystem.Transactions.TransactionScopeますか?

たとえば、このスニペットでは

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しかし、トランザクションで使用される接続で呼び出されたときの動作は私にはわかりません。

4

1 に答える 1

2

この特定のシナリオに関する公式のドキュメントが見つからなかったため、このシナリオをシミュレートする小さなサンプル( https://github.com/edymtt/sqlclientconnectionpoolで入手可能)を見つけました。このサンプルを実行する前に行うべき重要なことは、テストマシンでMS DTCを停止することです。これにより、分散トランザクションを処理せず、新しいSqlConnectionものが作成されることを見逃しません。

このようにSqlConnection.ClearPoolして、接続に関連付けられているトランザクションに関係なく、引数として渡された接続と同じ接続文字列を持つすべての接続をクリアすることを発見しました。

于 2013-04-14T16:13:25.103 に答える