Sobes.tech
Junior

Ce este o tranzacție?

sobes.tech AI

Răspuns de la AI

O tranzacție în contextul C# și bazelor de date/sistemelor distribuite este o secvență de operații executate ca o unitate indivizibilă (unitate de lucru atomică). Fie toate operațiile din tranzacție se finalizează cu succes (se confirmă), fie niciuna nu se execută (se revocă).

Tranzacțiile au proprietățile ACID:

  • Atomicitate: Toate operațiile se finalizează cu succes, sau niciuna.
  • Consistență: Tranzacția duce sistemul dintr-o stare consistentă în alta.
  • Izolare: Tranzacțiile executate în paralel nu se influențează reciproc.
  • Durabilitate: Rezultatele unei tranzacții finalizate cu succes rămân chiar și în caz de defecțiuni ale sistemului.

În C#, pentru lucrul cu tranzacții, se folosesc adesea următoarele clase:

  • System.Data.Common.DbTransaction (clasa de bază pentru tranzacțiile bazei de date)
  • System.Transactions.TransactionScope (simplifică gestionarea tranzacțiilor distribuite)
  • Clase specifice ale furnizorilor ADO.NET (de exemplu, System.Data.SqlClient.SqlTransaction)

Exemplu de utilizare a TransactionScope:

// Utilizarea TransactionScope pentru gestionarea automată a tranzacției
using System;
using System.Data.SqlClient;
using System.Transactions;

// Se presupune că există o șir de conexiune
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();
            // Simulare de eroare pentru demonstrație de rollback
            // Folosiți o instrucțiune UPDATE/INSERT/DELETE reală
            // using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
            // {
            //     command2.ExecuteNonQuery();
            // }
            throw new InvalidOperationException("Simulare de eroare"); // Simulare de eroare
        }

        // Dacă toate operațiile au reușit, se apelează Complete
        scope.Complete();
        Console.WriteLine("Tranzacție confirmată.");
    }
}
catch (Exception ex)
{
    // Dacă apare o eroare, TransactionScope revocă automat tranzacția
    Console.WriteLine($"Tranzacție revocată. Eroare: {ex.Message}");
}