Sobes.tech
Junior

Šta je transakcija?

sobes.tech АИ

Одговор од АИ

Транзакција у контексту 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}");
}