23 de set. de 2010

Linq to SQL com Transaction

Para quem não se lembra, quando estamos trabalhando com banco de dados, há casos em que temos que realizar uma série de manipulações de dados (inserts, updates, deletes etc). Mas e se algo der errado no meio do caminho? Teríamos como “desfazer” as operações realizadas anteriormente?

…Tendo em mente que um conjunto de operações em um banco de dados só fará sentido se todas as instruções forem executadas com sucesso.

Imagine o caso da matricula de um aluno: temos de gravar o aluno no banco de dados, gerar parcelas, grade de aulas. E se na hora de gerara as parcelas ocorrer algum problema? Vou deixar o aluno cadastrado sem parcelas? Nesse caso seria interessante “voltar no tempo”, desfazer o cadastro do aluno para que o usuário tentasse novamente.

Não é preciso fazer isso na mão. Os bancos de dados tem o recurso de transação. Quando abrimos uma transação, todos os dados manipulados só são efetivados no banco de dados após a confirmação de que tudo está ok. Para isso damos o nome de “commit”.

Caso algo de errado dentro de uma transação nós temos a opção de “desfazer tudo” automaticamente. Para isso damos o nome de “rollback”.

Mas isso é noção básica de banco de dados, caso se interessem mais é interessante estudar esse assunto. Ele é de extrema importância no desenvolvimento de software com banco de dados, e resolve uma boa quantidade de problemas de forma simples.

No Linq to SQL, apesar de “não ocorrer uma interação direta” com os objetos nativos de interação com o banco de dados, é possível realizar transactions normalmente, acompanhe o código a seguir:

dc.Connection.Open();

using (DbTransaction transaction = dc.Connection.BeginTransaction(IsolationLevel.ReadCommitted))
{
    dc.Transaction = transaction;
    try
    {
        // do database things
        dc.SubmitChanges();
        transaction.Commit();
    }
    catch (Exception ex)
    {
        transaction.Rollback();
        Console.WriteLine("Exception caught; transaction rolled back.");
        Console.WriteLine(ex.ToString());
    }
}

É importante lembrar que o try catch é um aliado imenso nesse tipo de situação.

Espero ter ajudado, até mais Alegre

0 comentários: