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