Транзакции

Последнее обновление: 11.02.2021

Транзакции позволяют выполнять набор операций в виде одного целостного пакета. И если хотя бы одна из операций из этого набора завершится неудачно, то произойдет откат выполнения остальных операций.

Для начала транзакции надо вызвать метод BeginTransaction() / BeginTransactionAsync() объекта SqlConnection:

using System;
using System.Threading.Tasks;
using Microsoft.Data.SqlClient;

namespace HelloApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            string connectionString = "Server=(localdb)\\mssqllocaldb;Database=adonetdb;Trusted_Connection=True;";

            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                await connection.OpenAsync();
                SqlTransaction transaction = connection.BeginTransaction();

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

                try
                {
                    // выполняем две отдельные команды
                    command.CommandText = "INSERT INTO Users (Name, Age) VALUES('Tim', 34)";
                    await command.ExecuteNonQueryAsync();
                    command.CommandText = "INSERT INTO Users (Name, Age) VALUES('Kat', 31)";
                    await command.ExecuteNonQueryAsync();

                    // подтверждаем транзакцию
                    await transaction.CommitAsync();
                    Console.WriteLine("Данные добавлены в базу данных");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    // если ошибка, откатываем назад все изменения
                    await transaction.RollbackAsync();
                }
            }
            Console.Read();
        }
    }
}

Чтобы все операции с объектом SqlCommand выполнялись как одна транзакция, надо присвоить объект транзакции его свойству Transaction:

command.Transaction = transaction;

Для завершения всех операции после их выполнения вызывается метод Commit()/CommitAsync() объекта SqlTransaction:

transaction.CommitAsync();

Если в ходе выполнения произошла ошибка, то мы можем откатить транзакцию, вызвав метод Rollback()/RollbackAsync():

transaction.RollbackAsync();
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850