Прочитать на английском

Поделиться через


TransactionScope.Complete Метод

Определение

Указывает, что все операции в области успешно завершены.

C#
public void Complete();

Исключения

Этот метод уже единожды вызван.

Примеры

В следующем примере показано, как использовать TransactionScope класс для определения блока кода для участия в транзакции.

C#
// 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 3rd party RDBMS 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();

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

            // The Complete method commits the transaction. If an exception has been thrown,
            // Complete is not  called and the transaction is rolled back.
            scope.Complete();
        }
    }
    catch (TransactionAbortedException ex)
    {
        writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
    }

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

    return returnValue;
}

Комментарии

Если все операции в область успешно завершены, вызовите этот метод только один раз, чтобы сообщить диспетчеру транзакций, что состояние всех ресурсов согласовано, и транзакция может быть зафиксирована. Очень рекомендуется поставить вызов в качестве последнего оператора в блоке using .

Дополнительные сведения об использовании этого метода см. в разделе Реализация неявной транзакции с помощью области транзакции .

Если не вызвать этот метод, транзакция прерывается, так как диспетчер транзакций интерпретирует это как системный сбой или исключения, создаваемые в область транзакции. Однако следует также отметить, что вызов этого метода не гарантирует фиксацию транзакции. Это просто способ информирования диспетчера транзакций о состоянии. После вызова этого метода вы больше не сможете получить доступ к внешней транзакции через Current свойство , и попытка сделать это приводит к возникновению исключения.

Фактическая работа фиксации между диспетчером ресурсов выполняется в инструкции End Using , TransactionScope если объект создал транзакцию. Если транзакция создана не этим объектом, фиксация происходит при каждом вызове метода Commit владельцем объекта CommittableTransaction. На этом этапе диспетчер транзакций вызывает диспетчеры ресурсов и сообщает им о необходимости фиксации или отката в зависимости от того, был ли вызван этот метод для TransactionScope объекта .

Применяется к

Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

См. также раздел