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