Sobes.tech
Junior

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

sobes.tech AI

Отговор от AI

Транзакцията в контекста на C# и базите данни/разпределените системи е последователност от операции, изпълнявани като едно цяло (атомарна единица работа). Или всички операции в транзакцията успешно завършват (фиксират се), или никоя не се изпълнява (отменя се).

Транзакциите притежават свойствата ACID:

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

В C# за работа с транзакции често се използват следните класове:

  • System.Data.Common.DbTransaction (базов клас за транзакции на бази данни)
  • System.Transactions.TransactionScope (улеснява управлението на разпределени транзакции)
  • Специфични класове за транзакции на ADO.NET доставчици (например, 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("Демонстрация на грешка"); // Имитация на грешка
        }

        // Ако всички операции са успешни, извикваме Complete
        scope.Complete();
        Console.WriteLine("Транзакцията е потвърдена.");
    }
}
catch (Exception ex)
{
    // Ако възникне грешка, TransactionScope автоматично отменя транзакцията
    Console.WriteLine($"Транзакцията е отменена. Грешка: {ex.Message}");
}