Sobes.tech
Junior

Mi az a tranzakció?

sobes.tech MI

Válasz az MI-től

A tranzakció a C# és az adatbázisok/disztribúciós rendszerek kontextusában egy műveletsorozat, amelyet egységes egészként hajtanak végre (atomikus munkarész). Vagy minden művelet sikeresen befejeződik (megerősítve), vagy egyik sem hajtódik végre (visszavonva).

A tranzakciók rendelkeznek az ACID tulajdonságokkal:

  • Atomitás: Minden művelet sikeresen befejeződik, vagy egyik sem.
  • Konzisztencia: A tranzakció a rendszert egy konzisztens állapotból egy másikba viszi.
  • Elszigeteltség: A párhuzamosan végrehajtott tranzakciók nem befolyásolják egymást.
  • Tartósság: Egy sikeresen befejezett tranzakció eredményei még rendszerhiba esetén is megmaradnak.

C#-ban a tranzakciókkal való munkához gyakran használják az alábbi osztályokat:

  • System.Data.Common.DbTransaction (az adatbázis tranzakciók alap osztálya)
  • System.Transactions.TransactionScope (egyszerűsíti a disztribúciós tranzakciók kezelését)
  • Specifikus ADO.NET szolgáltató tranzakciós osztályokat (pl. System.Data.SqlClient.SqlTransaction)

Példa a TransactionScope használatára:

// A tranzakció automatikus kezeléséhez a TransactionScope használata
using System;
using System.Data.SqlClient;
using System.Transactions;

// Feltételezzük, hogy létezik egy kapcsolat string
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();
            // Szimulált hiba a visszagörgetés demonstrálására
            // Használjon valódi UPDATE/INSERT/DELETE parancsot
            // using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
            // {
            //     command2.ExecuteNonQuery();
            // }
            throw new InvalidOperationException("Szimulált hiba"); // Hiba szimulálása
        }

        // Ha minden művelet sikeres, meghívjuk a Complete-et
        scope.Complete();
        Console.WriteLine("Tranzakció megerősítve.");
    }
}
catch (Exception ex)
{
    // Hiba esetén a TransactionScope automatikusan visszavonja a tranzakciót
    Console.WriteLine($"Tranzakció visszavonva. Hiba: {ex.Message}");
}