Sobes.tech
Junior

Cos'è una transazione?

sobes.tech AI

Risposta dell'AI

Una transazione nel contesto di C# e dei database/sistemi distribuiti è una sequenza di operazioni eseguite come un'unità indivisibile (unità di lavoro atomica). O tutte le operazioni nella transazione vengono completate con successo (confermate), oppure nessuna viene eseguita (annullata).

Le transazioni possiedono le proprietà ACID:

  • Atomicità: Tutte le operazioni vengono completate con successo, o nessuna.
  • Consistenza: La transazione porta il sistema da uno stato consistente a un altro.
  • Isolamento: Le transazioni eseguite in parallelo non si influenzano a vicenda.
  • Durabilità: I risultati di una transazione completata con successo rimangono anche in caso di guasti del sistema.

In C#, per lavorare con le transazioni, si usano spesso le seguenti classi:

  • System.Data.Common.DbTransaction (classe base per le transazioni di database)
  • System.Transactions.TransactionScope (semplifica la gestione delle transazioni distribuite)
  • Classi di transazione specifiche del provider ADO.NET (ad esempio, System.Data.SqlClient.SqlTransaction)

Esempio di utilizzo di TransactionScope:

// Uso di TransactionScope per gestire automaticamente una transazione
using System;
using System.Data.SqlClient;
using System.Transactions;

// Si assume che esista una stringa di connessione
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();
            // Simulazione di errore per dimostrare un rollback
            // Usare una query UPDATE/INSERT/DELETE reale
            // using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
            // {
            //     command2.ExecuteNonQuery();
            // }
            throw new InvalidOperationException("Simulazione di errore"); // Simulazione di errore
        }

        // Se tutte le operazioni sono andate a buon fine, si chiama Complete
        scope.Complete();
        Console.WriteLine("Transazione confermata.");
    }
}
catch (Exception ex)
{
    // Se si verifica un errore, TransactionScope annulla automaticamente la transazione
    Console.WriteLine($"Transazione annullata. Errore: {ex.Message}");
}