Sobes.tech
Junior

O que é uma transação?

sobes.tech IA

Resposta da IA

Uma transação no contexto de C# e bases de dados/sistemas distribuídos é uma sequência de operações executadas como uma unidade indivisível (unidade de trabalho atómica). Ou todas as operações na transação são concluídas com sucesso (confirmadas), ou nenhuma é executada (revertida).

As transações possuem as propriedades ACID:

  • Atomicidade: Todas as operações são concluídas com sucesso, ou nenhuma.
  • Consistência: A transação leva o sistema de um estado consistente para outro.
  • Isolamento: Transações que são executadas em paralelo não se afetam mutuamente.
  • Durabilidade: Os resultados de uma transação bem-sucedida permanecem mesmo em caso de falhas do sistema.

Em C#, para trabalhar com transações, costuma-se usar as seguintes classes:

  • System.Data.Common.DbTransaction (classe base para transações de bases de dados)
  • System.Transactions.TransactionScope (simplifica a gestão de transações distribuídas)
  • Classes específicas de provedores ADO.NET (por exemplo, System.Data.SqlClient.SqlTransaction)

Exemplo de uso de TransactionScope:

// Uso de TransactionScope para gerir automaticamente uma transação
using System;
using System.Data.SqlClient;
using System.Transactions;

// Assume-se que existe uma cadeia de conexão
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();
            // Simulação de erro para demonstração de rollback
            // Use uma instrução UPDATE/INSERT/DELETE real
            // using (var command2 = new SqlCommand("UPDATE Accounts SET Balance = Balance + 100 WHERE AccountId = 2", connection2))
            // {
            //     command2.ExecuteNonQuery();
            // }
            throw new InvalidOperationException("Simulando um erro"); // Simulação de erro
        }

        // Se todas as operações forem bem-sucedidas, chama-se Complete
        scope.Complete();
        Console.WriteLine("Transação confirmada.");
    }
}
catch (Exception ex)
{
    // Se ocorrer um erro, o TransactionScope reverte automaticamente a transação
    Console.WriteLine($"Transação revertida. Erro: {ex.Message}");
}