ADO.NET проверяет, возможен ли откат

Я спрашиваю себя, можно ли проверить, можно ли в 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 всегда должна использоваться при откате транзакции. Откат создает исключение InvalidOperationException, если соединение разорвано или транзакция уже была отменена на сервере.

Но я не могу поверить, что try/catch является рекомендуемым решением для проверки возможности отката.

Я знаю, что в реализации SQL Server объекты SQLTransaction возвращают null в свойстве Connection, если транзакция является "зомби".

Но это довольно специфично для реализации и работает только с SQL Server.

Итак, существует ли независимый от базы данных способ определить, можно ли откатить транзакцию?

Тиа Мартин


person Martin Moser    schedule 04.12.2008    source источник


Ответы (2)


Большая часть этой сложности решается с помощью объекта TransactionScope в операторе «using» — проверьте его на MSDN. Одно предостережение заключается в том, что TransactionScope будет автоматически «масштабироваться» для использования распределенной транзакции, когда это будет сочтено необходимым — иногда это желательно, а иногда нет, поэтому будьте осторожны, если вы вкладываете TransactionScopes.

person user19371    schedule 04.12.2008

проблема в том, что в не SQL 2005 область транзакций повышена до распределенной транзакции, что является довольно накладным.

person Martin Moser    schedule 05.12.2008