Sobes.tech
Junior

Čo je transakcia?

sobes.tech AI

Odpoveď od AI

Transakcia v kontexte C# a databáz alebo distribuovaných systémov je sled operácií vykonávaných ako celok (atomárna jednotka práce). Buď všetky operácie v transakcii úspešne skončia (potvrdia sa), alebo žiadna sa nevykoná (vráti sa späť).

Transakcie majú vlastnosti ACID:

  • Atomickosť (Atomicity): Buď sa všetky operácie vykonajú úspešne, alebo žiadna.
  • Konzistentnosť (Consistency): Transakcia prenáša systém z jedného konzistentného stavu do druhého.
  • Izolovanosť (Isolation): Paralelne vykonávané transakcie na seba neovplyvňujú.
  • Trvácnosť (Durability): Výsledky úspešne ukončenej transakcie sa zachovávajú aj pri zlyhaní systému.

V C# sa na prácu s transakciami často používajú tieto triedy:

  • System.Data.Common.DbTransaction (základná trieda pre databázové transakcie)
  • System.Transactions.TransactionScope (zjednodušuje správu distribuovaných transakcií)
  • Špecifické triedy pre transakcie ADO.NET poskytovateľa (napríklad System.Data.SqlClient.SqlTransaction)

Príklad použitia TransactionScope:

// Použitie TransactionScope na automatické riadenie transakcie
using System;
using System.Data.SqlClient;
using System.Transactions;

// Predpokladáme, že máme pripojovací reťazec
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();
            // Umelá chyba na demonštráciu rollbacku
            // Použite reálny UPDATE/INSERT/DELETE
            // using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
            // {
            //     command2.ExecuteNonQuery();
            // }
            throw new InvalidOperationException("Simulovaná chyba"); // Napodobnenie chyby
        }

        // Ak všetky operácie prebehli úspešne, voláme Complete
        scope.Complete();
        Console.WriteLine("Transakcia potvrdená.");
    }
}
catch (Exception ex)
{
    // Ak nastane chyba, TransactionScope automaticky rollbackuje transakciu
    Console.WriteLine($"Transakcia bola zrušená. Chyba: {ex.Message}");
}