Cómo realizar transacciones en LINQ to SQL

14 ene. 2009

En las aplicaciones empresariales es imprescindible realizar operaciones con las bases de datos que se comporten como un todo o que no se ejecuten si ocurre algún problema.

Supongamos, que queremos programar una transferencia de dinero entre dos cuentas bancarias. Para ello, el programa debe restar el importe de la transferencia de la cuenta A y además aumentar esta misma cantidad en la cuenta B. ¿Qué pasaría si entre una operación y otra ocurre un error y no estamos utilizando transacción? Pues que la base de datos se quedaría en un estado inconsistente, y en la vida real seguramente acabaríamos en la cárcel.

Para evitar el calabozo existen las transacciones.

Si estamos utilizando LINQ to SQL, uno de los métodos más sencillos para realizar transacciones, es utilizar el objeto TransactionScope que se encuentra en el espacio de nombres System.Transactions. Seguramente tendrás que añadirlo a tus referencias del proyecto porque no está incluido por defecto.

Una vez añadida la referencia necesaria, comenzamos una transacción creando el objeto TransactionScope dentro de una sentencia ‘using’ y al finalizar la transacción llamaremos al método Complete de este objeto. Como siempre, un ejemplo vale más que mil palabras:

    1 public void Transfer(Account a, Account b, decimal amount)

    2 {

    3     using (TransactionScope transactionScope = new TransactionScope())

    4     {

    5         a.Balance -= amount;

    6         db.SubmitChanges();

    7 

    8         b.Balance += amount;

    9         db.SubmitChanges();

   10 

   11         transactionScope.Complete();

   12     }

   13 

   14 }

En este ejemplo suponemos que los objetos Account ya existen previamente en la base de datos, y que db es el DataContext de Linq, por lo que al realizar cualquier cambio en sus propiedades y llamar a SubmitChanges, la información se persistirá en la base de datos.

Por supuesto, este código no tiene nada que ver con la realidad. ¡Ni se os ocurra utilizarlo en una aplicación real!

Utilizando las transacciones, los cambios no se persistirán definitivamente en la base de datos hasta llamar al método Complete. Si en la línea 9 ocurriera algún error (por ejemplo, un fallo de conectividad con la base de datos), los cambios en la cuenta A no se producirán, librándonos de un mal rato entre rejas.

comments powered by Disqus
subir