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

Leave a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.