Sobes.tech
Junior

Wat is een transactie?

sobes.tech AI

Antwoord van AI

Een transactie in de context van C# en databases/distributed systemen is een reeks operaties die als één ondeelbare eenheid worden uitgevoerd (atomair werkingsproces). Of alle operaties in de transactie slagen (bevestigd), of geen enkele wordt uitgevoerd (teruggedraaid).

Transacties beschikken over de eigenschappen ACID:

  • Atomair (Atomicity): Alle operaties worden succesvol voltooid, of geen enkele.
  • Consistentie (Consistency): De transactie brengt het systeem van één consistente toestand naar een andere.
  • Isolatie (Isolation): Gelijktijdig uitgevoerde transacties beïnvloeden elkaar niet.
  • Duurzaamheid (Durability): De resultaten van een succesvolle transactie blijven behouden, zelfs bij systeemstoringen.

In C# worden vaak de volgende klassen gebruikt voor het werken met transacties:

  • System.Data.Common.DbTransaction (basis klasse voor database-transacties)
  • System.Transactions.TransactionScope (vereenvoudigt het beheer van gedistribueerde transacties)
  • Specifieke transactieklassen van ADO.NET providers (bijvoorbeeld System.Data.SqlClient.SqlTransaction)

Voorbeeld van gebruik van TransactionScope:

// Gebruik van TransactionScope voor automatische transatiemanagement
using System;
using System.Data.SqlClient;
using System.Transactions;

// Er wordt aangenomen dat er een verbindingsreeks bestaat
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();
            // Simulatie van een fout voor rollback demonstratie
            // Gebruik een echte UPDATE/INSERT/DELETE
            // using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
            // {
            //     command2.ExecuteNonQuery();
            // }
            throw new InvalidOperationException("Simulatie van een fout"); // Fout simulatie
        }

        // Als alle operaties succesvol zijn, wordt Complete() aangeroepen
        scope.Complete();
        Console.WriteLine("Transactie bevestigd.");
    }
}
catch (Exception ex)
{
    // Bij een fout wordt de transactie automatisch teruggedraaid
    Console.WriteLine($"Transactie teruggedraaid. Fout: {ex.Message}");
}