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}");
}