Junior
¿Qué es una transacción?
sobes.tech AI
Respuesta de la IA
Una transacción en el contexto de C# y bases de datos/sistemas distribuidos es una secuencia de operaciones que se realiza como una unidad indivisible (unidad atómica de trabajo). Todas las operaciones en la transacción se completan con éxito (se confirman), o ninguna se realiza (se revierte).
Las transacciones poseen las propiedades ACID:
- Atomicidad: Todas las operaciones se completan con éxito, o ninguna.
- Consistencia: La transacción lleva el sistema de un estado consistente a otro.
- Aislamiento: Las transacciones que se ejecutan en paralelo no afectan entre sí.
- Durabilidad: Los resultados de una transacción que se completa con éxito se mantienen incluso en caso de fallos del sistema.
En C#, para trabajar con transacciones, a menudo se utilizan las siguientes clases:
System.Data.Common.DbTransaction(clase base para transacciones de bases de datos)System.Transactions.TransactionScope(simplifica la gestión de transacciones distribuidas)- Clases específicas de proveedores ADO.NET (por ejemplo,
System.Data.SqlClient.SqlTransaction)
Ejemplo de uso de TransactionScope:
// Uso de TransactionScope para gestionar automáticamente una transacción
using System;
using System.Data.SqlClient;
using System.Transactions;
// Se asume que existe una cadena de conexión
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();
// Error simulado para demostrar un rollback
// Use una sentencia UPDATE/INSERT/DELETE real en producción
// using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
// {
// command2.ExecuteNonQuery();
// }
throw new InvalidOperationException("Simulación de error"); // Simulación de error
}
// Si todas las operaciones son exitosas, se llama a Complete
scope.Complete();
Console.WriteLine("Transacción confirmada.");
}
}
catch (Exception ex)
{
// Si ocurre un error, TransactionScope revierte automáticamente la transacción
Console.WriteLine($"Transacción revertida. Error: {ex.Message}");
}