Junior
Czym jest transakcja?
sobes.tech AI
Odpowiedź od AI
Transakcja w kontekście C# i baz danych/systemów rozproszonych to sekwencja operacji wykonywanych jako niepodzielna jednostka (atomowa jednostka pracy). Wszystkie operacje w transakcji kończą się powodzeniem (zatwierdzeniem), albo żadna nie jest wykonywana (wycofaniem).
Transakcje posiadają właściwości ACID:
- Atomowość: Wszystkie operacje kończą się powodzeniem, albo żadna.
- Spójność: Transakcja przeprowadza system z jednego spójnego stanu w inny.
- Izolacja: Transakcje wykonywane równolegle nie wpływają na siebie nawzajem.
- Trwałość: Wyniki pomyślnie zakończonej transakcji są zachowywane nawet w przypadku awarii systemu.
W C# do pracy z transakcjami często używa się następujących klas:
System.Data.Common.DbTransaction(klasa bazowa dla transakcji baz danych)System.Transactions.TransactionScope(ułatwia zarządzanie transakcjami rozproszonymi)- Specyficzne klasy transakcji dostawcy ADO.NET (np.
System.Data.SqlClient.SqlTransaction)
Przykład użycia TransactionScope:
// Użycie TransactionScope do automatycznego zarządzania transakcją
using System;
using System.Data.SqlClient;
using System.Transactions;
// Zakłada się, że istnieje łańcuch połączenia
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();
// Symulowany błąd do demonstracji wycofania
// Użyj rzeczywistego UPDATE/INSERT/DELETE
// using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
// {
// command2.ExecuteNonQuery();
// }
throw new InvalidOperationException("Symulacja błędu"); // Symulacja błędu
}
// Jeśli wszystkie operacje się powiodły, wywołujemy Complete
scope.Complete();
Console.WriteLine("Transakcja zatwierdzona.");
}
}
catch (Exception ex)
{
// W przypadku błędu, TransactionScope automatycznie wycofuje transakcję
Console.WriteLine($"Transakcja wycofana. Błąd: {ex.Message}");
}