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