TransactionScope.Dispose メソッドとは? わかりやすく解説

Weblio 辞書 > コンピュータ > .NET Framework クラス ライブラリ リファレンス > TransactionScope.Dispose メソッドの意味・解説 

TransactionScope.Dispose メソッド

メモ : このメソッドは、.NET Framework version 2.0新しく追加されたものです。

トランザクション スコープ終了します

名前空間: System.Transactions
アセンブリ: System.Transactions (system.transactions.dll 内)
構文構文

解説解説

このメソッド呼び出すとトランザクション スコープ末尾マークされます。TransactionScope オブジェクトによってトランザクション作成されスコープComplete呼び出され場合、このメソッド呼び出すと、TransactionScope オブジェクトトランザクションコミットしようとします

C#using 構築使用すると、例外発生した場合でも必ずこのメソッド呼び出されます。このメソッド呼び出し後に発生した例外は、トランザクション影響しない場合ありますまた、このメソッドアンビエント トランザクションを元の状態に復元します。実際にトランザクションコミットされなかった場合、TransactionAbortedException がスローさます。

このメソッド同期的動作しトランザクションコミットまたは中止されるまでブロックします。そのため、このメソッドWindows フォーム (WinForm) アプリケーション使用する場合は、デッドロック発生十分な注意が必要です。WinForm コントロール イベント (ボタン クリックなど) でこのメソッド呼び出しトランザクションの処理中に同期メソッド Invoke使用して制御なんらかの UI タスク (色の変更など) にリダイレクトした場合デッドロック発生します。これは、Invoke メソッド同期的動作しUI スレッドが処理を終えるまでワーカー スレッドブロックされるためです。また、この場合UI スレッド側も、ワーカー スレッドトランザクションコミット完了するまで待機しようとしますその結果いずれも処理を行うことができず、決して終わることのないコミット処理を無期限待機することとなってしまいますこのためできるだけ Invoke使わずに、非同期動作する BeginInvoke を使用することをお勧めます。こうすることで、デッドロック発生抑えることができます

このメソッド使用方法詳細については、「トランザクション スコープ使用した暗黙的なトランザクション実装」を参照してください

使用例使用例

次の例では、TransactionScope クラス使用してトランザクション参加するコード ブロック定義する方法示します

'  This function takes arguments for 2 connection strings and commands
 to create a transaction 
'  involving two SQL Servers. It returns a value > 0 if the transaction
 is committed, 0 if the 
'  transaction is rolled back. To test this code, you can connect to
 two different databases 
'  on the same server by altering the connection string, or to another
 RDBMS such as Oracle 
'  by altering the code in the connection2 code block.
Public Function CreateTransactionScope( _
  ByVal connectString1 As String,
 ByVal connectString2 As String,
 _
  ByVal commandText1 As String,
 ByVal commandText2 As String)
 As Integer

    ' Initialize the return value to zero and create a StringWriter
 to display results.
    Dim returnValue As Integer
 = 0
    Dim writer As System.IO.StringWriter =
 New System.IO.StringWriter

    ' Create the TransactionScope to execute the commands, guaranteeing
    '  that both commands can commit or roll back as a single unit of
 work.
    Using scope As New TransactionScope()
        Using connection1 As 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.
                Dim command1 As SqlCommand
 = 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 connection2 As 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
                        Dim command2 As SqlCommand
 = New SqlCommand(commandText2, connection2)
                        returnValue = command2.ExecuteNonQuery()
                        writer.WriteLine("Rows to be affected
 by command2: {0}", returnValue)

                    Catch ex As Exception
                        ' Display information that command2 failed.
                        writer.WriteLine("returnValue for command2:
 {0}", returnValue)
                        writer.WriteLine("Exception Message2:
 {0}", ex.Message)
                    End Try
                End Using

            Catch ex As Exception
                ' Display information that command1 failed.
                writer.WriteLine("returnValue for command1: {0}",
 returnValue)
                writer.WriteLine("Exception Message1: {0}",
 ex.Message)
            End Try
        End Using

        ' The Complete method commits the transaction. If an exception
 has been thrown,
        ' Complete is called and the transaction is rolled back.
        scope.Complete()
    End Using

    ' The returnValue is greater than 0 if the transaction committed.
    If returnValue > 0 Then
        writer.WriteLine("Transaction was committed.")
    Else
       ' You could write additional business logic here, for example,
 you can notify the caller 
       ' by throwing a TransactionAbortedException, or logging the failure.
       writer.WriteLine("Transaction rolled back.")
     End If

    ' Display messages.
    Console.WriteLine(writer.ToString())

    Return returnValue
End Function
// This function takes arguments for 2 connection strings and commands
 to create a transaction 
// involving two SQL Servers. It returns a value > 0 if the transaction
 is committed, 0 if the 
// transaction is rolled back. To test this code, you can connect to
 two different databases 
// on the same server by altering the connection string, or to another
 RDBMS such as Oracle 
// by altering the code in the connection2 code block.
static public int CreateTransactionScope(
    string connectString1, string connectString2
,
    string commandText1, string commandText2)
{
    // Initialize the return value to zero and create a StringWriter
 to display results.
    int returnValue = 0;
    System.IO.StringWriter writer = new System.IO.StringWriter();

    // 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();
    }

    // The returnValue is greater than 0 if the transaction committed.
    if (returnValue > 0)
    {
        writer.WriteLine("Transaction was committed.");
    }
    else
    {
        // You could write additional business logic here, for example,
 you can notify the caller 
        // by throwing a TransactionAbortedException, or logging the
 failure.
        writer.WriteLine("Transaction rolled back.");
    }

    // Display messages.
    Console.WriteLine(writer.ToString());

    return returnValue;
}
プラットフォームプラットフォーム
バージョン情報バージョン情報
参照参照


このページでは「.NET Framework クラス ライブラリ リファレンス」からTransactionScope.Dispose メソッドを検索した結果を表示しています。
Weblioに収録されているすべての辞書からTransactionScope.Dispose メソッドを検索する場合は、下記のリンクをクリックしてください。
 全ての辞書からTransactionScope.Dispose メソッド を検索

英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

TransactionScope.Dispose メソッドのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



TransactionScope.Dispose メソッドのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
日本マイクロソフト株式会社日本マイクロソフト株式会社
© 2025 Microsoft.All rights reserved.

©2025 GRAS Group, Inc.RSS