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.