2011-01-14 9 views
0

私はC#プログラマーです。私はこの複雑な概念をクリアしたい。このシナリオでSQLトランザクションを処理する方法は?

2つのデータベースがある場合:AとBレコードを両方ともAからBに挿入したいとします.DB Bに挿入中に例外が発生したとします。 Bがクラッシュした場合、db Aとのトランザクションもロールバックされなければならないという状況です。私は何をしなければならないのですか?

私はSqlConnectionStringクラスでSqlTransactionオブジェクトを使用できます。これにいくつかのコードを付けることはできますか?

+0

[複数のデータベースでトランザクションを実装する方法]の複製が可能です(http://stackoverflow.com/questions/1063502/how-to-implement-transaction-over-multiple-databases) –

答えて

4

既に尋ねられているのはです。 keithwarren7から

ベストの答え:

が必要な場合に自動的に分散トランザクションに変換します。この

using(TransactionScope ts = new TransactionScope()) 
{ 
    //all db code here 

    // if error occurs jump out of the using block and it will dispose and rollback 

    ts.Complete(); 
} 

のようなクラスをのTransactionScopeクラスを使用します。

編集:http://msdn.microsoft.com/fr-fr/library/system.transactions.transactionscope%28v=vs.80%29.aspx:あなたはMSDNで良い例を持っている本来の答えへの説明

を追加します。

この例では、1つのTransactionScopeで2つのデータベース接続を使用する方法を示します。

// Create the TransactionScope to execute the commands, guaranteeing 
    // that both commands can commit or roll back as a single unit of work. 
    using (TransactionScope scope = new TransactionScope()) 
    { 
     using (SqlConnection connection1 = new SqlConnection(connectString1)) 
     { 
      try 
      { 
       // Opening the connection automatically enlists it in the 
       // TransactionScope as a lightweight transaction. 
       connection1.Open(); 

       // Create the SqlCommand object and execute the first command. 
       SqlCommand command1 = new SqlCommand(commandText1, connection1); 
       returnValue = command1.ExecuteNonQuery(); 
       writer.WriteLine("Rows to be affected by command1: {0}", returnValue); 

       // If you get here, this means that command1 succeeded. By nesting 
       // the using block for connection2 inside that of connection1, you 
       // conserve server and network resources as connection2 is opened 
       // only when there is a chance that the transaction can commit. 
       using (SqlConnection connection2 = new SqlConnection(connectString2)) 
        try 
        { 
         // The transaction is escalated to a full distributed 
         // transaction when connection2 is opened. 
         connection2.Open(); 

         // Execute the second command in the second database. 
         returnValue = 0; 
         SqlCommand command2 = new SqlCommand(commandText2, connection2); 
         returnValue = command2.ExecuteNonQuery(); 
         writer.WriteLine("Rows to be affected by command2: {0}", returnValue); 
        } 
        catch (Exception ex) 
        { 
         // Display information that command2 failed. 
         writer.WriteLine("returnValue for command2: {0}", returnValue); 
         writer.WriteLine("Exception Message2: {0}", ex.Message); 
        } 
      } 
      catch (Exception ex) 
      { 
       // Display information that command1 failed. 
       writer.WriteLine("returnValue for command1: {0}", returnValue); 
       writer.WriteLine("Exception Message1: {0}", ex.Message); 
      } 
     } 

     // The Complete method commits the transaction. If an exception has been thrown, 
     // Complete is not called and the transaction is rolled back. 
     scope.Complete(); 
    } 
+0

この回答から何も得られません。説明してください。 –

+0

@Lalit:編集済み投稿: – LaGrandMere

+0

ありがとう、これは私が期待していたものです –

0

一つだけの接続を持っていると、あなたはLinked Serverを使用しても、その後の事を管理し、サーバBからSPを呼び出すことができ、サーバAからSPを呼びたい場合は

:)

関連する問題