4

TransactionScope で 2 つの SQLConnection を使用していますが、この (疑似) コードは正しいですか?

using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew))
  {
     using (SqlConnection connection1 = new SqlConnection(ConnectionString1))
       {
         (...)
       }

     using (SqlConnection connection2 = new SqlConnection(ConnectionString2))
        {
           (...)
        }

     ts.Complete();
   }

または私はこれを使用する必要がありますか?

using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew))
  {
     using (SqlConnection connection1 = new SqlConnection(ConnectionString1))
       {
         (...)
         using (SqlConnection connection2 = new SqlConnection(ConnectionString2))
          {
             (...)
             ts.Complete();
          }
       }
   }

最初のコードは、メソッドでコマンドを抽出できるため、より優れています。ただし、この場合、スコープが完了する前に接続が破棄されるのではないかと心配しています.TransactionScopeへの参加はこれを防ぐのに十分ですか?

4

4 に答える 4

1

最初の例では、ts.Complete()メソッドが接続を使用しないため、ts.Complete()が呼び出される前に両方の接続が破棄されますが、これは問題ではありません。

  • 両方の接続はこのメソッド内でローカルに宣言されており、他のメソッドの範囲外になります
  • 接続は、スコープに入れるためにts.Complete()メソッドに渡されません

2番目の例では、両方の接続がまだ有効なときにts.Complete()メソッドが呼び出されますが、それらはメソッドに渡されないため、使用できません。

これは、両方のメソッドが同等に機能することを意味し、ts.Complete()が呼び出される前に接続が破棄されるかどうかは関係ありません。

于 2013-03-20T15:01:31.570 に答える
1

Completeネストされた接続が破棄された後の呼び出しにはまったく問題はありません。トランザクションの有効期間は、意図的に SQL 接続の有効期間よりも長く設定されており、他の接続の有効期間とは関係なく、引き続き操作を行うことができます。

はい、最初の例ではComplete、接続が破棄された後に呼び出していますが、それはまったく問題ありません。

トランザクション スコープのドキュメントの例と、トランザクションスコープの使用方法に関するこのページに基づいて、接続が破棄された後にトランザクションを完了することができることがわかります。

于 2013-03-20T15:21:55.980 に答える
0

MSDNサイトを見ると、2番目のサイトが使用しているように見えます...

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx(最初の例を参照)

于 2013-03-20T15:00:35.350 に答える
0

3番目の可能性があります:

using (TransactionScope ts= new TransactionScope(TransactionScopeOption.RequiresNew))
using (SqlConnection connection1 = new SqlConnection(ConnectionString1))
using (SqlConnection connection2 = new SqlConnection(ConnectionString2))
{
    // ...
    ts.Complete()
}
于 2013-03-20T15:01:01.620 に答える