2

ADO.NET で現在のトランザクションをロールバックできるかどうかを確認できるかどうかを自問しています。

msdn は、次の実装を提案しています。

private static void ExecuteSqlTransaction(string connectionString)
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        SqlCommand command = connection.CreateCommand();
        SqlTransaction transaction;

        // Start a local transaction.
        transaction = connection.BeginTransaction("SampleTransaction");

        // Must assign both transaction object and connection
        // to Command object for a pending local transaction
        command.Connection = connection;
        command.Transaction = transaction;

        try
        {
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
            command.ExecuteNonQuery();
            command.CommandText =
                "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
            command.ExecuteNonQuery();

            // Attempt to commit the transaction.
            transaction.Commit();
            Console.WriteLine("Both records are written to database.");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
            Console.WriteLine("  Message: {0}", ex.Message);

            // Attempt to roll back the transaction.
            try
            {
                transaction.Rollback();
            }
            catch (Exception ex2)
            {
                // This catch block will handle any errors that may have occurred
                // on the server that would cause the rollback to fail, such as
                // a closed connection.
                Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
                Console.WriteLine("  Message: {0}", ex2.Message);
            }
        }
    }
}

さらに、次の注意事項があります。トランザクションをロールバックするときは、Try/Catch 例外処理を常に使用する必要があります。接続が終了した場合、またはトランザクションがサーバー上で既にロールバックされている場合、Rollback は InvalidOperationException を生成します。

しかし、ロールバックが可能かどうかを確認するために try/catch が推奨される解決策であるとは本当に信じられません。

SQL Server の実装では、トランザクションが「ゾンビ」の場合、SQLTransaction オブジェクトは Connection プロパティで null を返すことを知っています。

ただし、これは実装固有のものであり、SQL Server でのみ機能します。

では、トランザクションをロールバックできるかどうかを検出する db に依存しない方法はありますか?

ティア・マーティン

4

2 に答える 2

1

この複雑さの多くは、"using" ステートメントで TransactionScope オブジェクトを使用することによって処理されます。MSDNで確認してください。1 つの注意点は、TransactionScope が必要と判断された場合に、分散トランザクションを使用するように自動的に「スケールアップ」することです。これが望ましい場合もあれば、そうでない場合もあるため、TransactionScope をネストする場合は注意してください。

于 2008-12-04T13:09:22.720 に答える
0

問題は、SQL 2005 以外では、トランザクション スコープが分散トランザクションに昇格され、かなりのオーバーヘッドになることです。

于 2008-12-05T10:49:07.713 に答える