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