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