ADO.NET TRANSACTIONS
ADO NET TRANSACTIONS
Transacciones en ADO.NET
Las transacciones en ADO.NET se usan cuando se desea juntar varias tareas juntas, de manera que son ejecutadas como una única «unidad» de trabajo. Por ejemplo, queremos una aplicación que realice dos acciones en nuestra base de datos, la primera acción inserta un registro y la otra acción modifica otro registro. Con las transacciones de ADO.NET, no importa que cualquiera de las dos acciones falle, ya que los cambios no se realizarán en la base de datos debido a un «rollback».
Determinando el tipo de la transacción
Podemos considerar dos tipos de transacciones; transacciones locales y transacciones distribuidas, dependiendo de como las controle.
Transacciones locales
Las transacciones locales son consideradas como tal cuando se trata de una transacción de «una fase» y es controlada por la base de datos directamente. Por ejemplo, hacemos un INSERT en una tabla y seguidamente hacemos COMMIT.
Transacciones distribuidas
Las transacciones distribuidas se denominan de esta manera cuando la transacción es coordinada por un «monitor de transacciones», el cual usa un mecanismo a prueba de fallos (como un «commit» de dos fases) para la resolución de transacciones.
Cada uno de los proveedores de datos del Framework .NET tiene su propio objeto «Transaction» para realizar transacciones locales. Si necesitas una transacción que se realice en una base de datos SQL Server, utiliza una transacción «System.Data.SqlClient». Para una transacción en Oracle, utiliza el proveedor «System.Data.OracleClient». Adicionalmente, existe una clase DbTransaction que es usada para código dependiente del proveedor que requiere transacciones.
Realizar una transacción usando una sola conexión
En ADO.NET, controlas las transacciones con el objeto «Connection». Puede iniciar una transacción local con el método «BeginTransaction». Una vez que la transacción ha comenzado, puedes establecer un comando en la transacción con la propiedad «Transaction» del objeto «Command». Una vez hecho esto, puedes hacer «commit» o «rollback» a las modificaciones hechas al «data source» basándote en el éxito o fallo de tus componentes de transacción.
Para demostrar el uso de este elemento de .NET realizaremos un ejemplo simple. Tendremos una base de datos con dos tablas; «Clientes», con los registros «Nombre» y «Sueldo»; y la tabla «Productos», con los registros «Nombre» y «Precio». Realizaremos una aplicación sencilla de Windows Forms, la cual tendrá dos listbox con los nombres de los clientes y productos. Cuando se seleccione uno, se mostrará el sueldo restante o el precio del producto en caso de que haya seleccionado la lista de éstos. Una vez se haya elegido un elemento de cada, podremos pulsar el botón comprar, que intentará restar la cantidad del producto al sueldo del cliente. Controlaremos que pueda realizar la compra o no con «commits», «rollbacks» y control de excepciones.
Ejemplo de transacciones – Paso a paso
Para realizar este ejemplo lo primero que debemos hacer es crear una base de datos, la cual podremos usar en Azure o en local. Tendrá dos tablas con dos registros cada una, como se ha mencionado en el apartado anterior. Una vez que tengamos creada la base de datos y las tablas, procederemos a introducir unos datos de ejemplo para que funcione nuestro ejemplo. En mi caso, estos son los datos:

En Visual Studio, haremos un proyecto de Windows Forms, el cual tendrá dos listbox para mostrar los nombres de los clientes y productos. Cuando seleccionemos uno, en un label situado abajo de cada listbox, mostrará el sueldo o el precio correspondiente. Tendremos un botón que, si tenemos seleccionados un elemento en cada listbox, intentará realizar la «compra». De esta manera el diseño quedará de manera similar a esto:

Para cargar los clientes y los productos en los listbox correspondientes, haremos un método llamado CargarList(), el cual llamaremos en el Form_Load. En este método utilizaremos un SqlConnection para hacer dos selects, los cuales, según los vayamos leyendo, utilizaremos los datos para rellenar los listbox.


Cuando seleccionemos un cliente y/o producto, tendremos que mostrar el sueldo/precio en el label, para ello, tendremos dos métodos, los cuales recuperarán el sueldo/precio de quien hayamos seleccionado.
Para el sueldo:

Para el precio:

Una vez que hayamos programado estos métodos, la interfaz nos quedaría de la siguiente manera:

Ahora procederemos a programar el botón. Lo primero que debemos hacer es comprobar si se han seleccionado un cliente y producto. Si se han seleccionado, debemos comprobar si el sueldo quedaría negativo al realizar la compra. Si es menor que 0, la compra no se realiza. En este ejemplo lanzaremos una excepción que controlaremos y mostraremos un mensaje, así como haremos rollback en la transacción. Si el sueldo es cero o más, podemos hacer la compra, actualizando la base de datos y realizando un commit. Para ello, programaremos lo siguiente:



Una vez programado esto habremos finalizado el ejemplo.
Autor: Fernando Vado Marín
Curso: Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin
Centro: Tajamar
Año académico: 2017-2018