Sobes.tech
Junior
165
questionbank

Что такое транзакция?

Answer from AI

sobes.tech AI

Транзакция в контексте C# и баз данных/распределенных систем — это последовательность операций, выполняемая как единое целое (атомарная единица работы). Либо все операции в транзакции успешно завершаются (фиксируются), либо ни одна не выполняется (откатывается).

Транзакции обладают свойствами ACID:

  • Атомарность (Atomicity): Либо все операции выполняются успешно, либо ни одна.
  • Согласованность (Consistency): Транзакция переводит систему из одного согласованного состояния в другое.
  • Изолированность (Isolation): Параллельно выполняющиеся транзакции не влияют друг на друга.
  • Надежность (Durability): Результаты успешно завершенной транзакции сохраняются даже при сбоях системы.

В C# для работы с транзакциями часто используются такие классы:

  • System.Data.Common.DbTransaction (базовый класс для транзакций БД)
  • System.Transactions.TransactionScope (упрощает управление распределенными транзакциями)
  • Specific ADO.NET provider transaction classes (например, System.Data.SqlClient.SqlTransaction)

Пример использования TransactionScope:

// Использование TransactionScope для автоматического управления транзакцией
using System;
using System.Data.SqlClient;
using System.Transactions;

// Предполагаем наличие строки подключения
string connectionString = "...";

try
{
    using (var scope = new TransactionScope())
    {
        using (var connection1 = new SqlConnection(connectionString))
        {
            connection1.Open();
            using (var command1 = new SqlCommand("UPDATE Accounts SET Balance = Balance - 100 WHERE AccountId = 1", connection1))
            {
                command1.ExecuteNonQuery();
            }
        }

        using (var connection2 = new SqlConnection(connectionString))
        {
            connection2.Open();
            // Искусственная ошибка для демонстрации отката
            // Используйте реальный UPDATE/INSERT/DELETE
            // using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
            // {
            //     command2.ExecuteNonQuery();
            // }
            throw new InvalidOperationException("Simulating an error"); // Имитация ошибки
        }

        // Если все операции прошли успешно, вызываем Complete
        scope.Complete();
        Console.WriteLine("Transaction committed.");
    }
}
catch (Exception ex)
{
    // Если произошла ошибка, TransactionScope автоматически откатывает транзакцию
    Console.WriteLine($"Transaction rolled back. Error: {ex.Message}");
}