MySQL/Gestión/Transaccionalidad

Una Transacción es un conjunto de operaciones ejecutadas como una unidad cuyo resultado final es una acción que manipula la base de datos. Un fallo en la ejecución de una de las operaciones provoca una reversión de la transacción, recuperando el estado inicial del a base de datos.

Las transacciones tienen cuatro propiedades:

  • Atomicidad: Todas las operaciones dentro de una unidad se deben completar con éxito. En caso contrario, la transacción se detiene en el momento del error y se revierten las operaciones anteriores hasta alcanzar el estado inicial.
  • Consistencia: El SGBD debe asegurar que la base de datos cambia correctamente de estado tras una transacción.
  • Aislamiento: Las operaciones funcionan con independencia y transparencia entre ellas.
  • Durabilidad: El resultado de una transacción finalizada debe persistir en caso de fallo del sistema.

Para utilizar transacciones en la programación de MySQL se precisa de un motor que acepte transacciones. El más popular es InnoDB. Si nuestra versión de MySQL soporta este tipo de tablas, su uso es sencillo. Sólo hay que añadir una definición a la declaración de creación de tablas:

->)TYPE=InnoDB;

Sentencias: BEGIN, COMMIT y ROLLBACK editar

Las transacciones en MySQL comienzan con la sentencia BEGIN y finalizan ya sea con un COMMIT o un ROLLBACK. Entre estos comandos se encuentra el núcleo de la transacción. Una transacción exitosa finaliza con un COMMIT, el cual hace efectivos los cambios sobre la base de datos. En cambio, si se produce un fallo en la transacción, un ROLLBACK invertirá los cambios hasta volver a la posición de inicio.

Existe una variable llamada AUTOCOMMIT, cuya función es controlar el comportamiento de una operación. Cuando está activado (SET AUTOCOMMIT = 1) cada sentencia SQL (dentro y fuera de las transacciones) se considera una transacción completa y se realiza un COMMIT cuando termine.

Cuando está desactivado (SET AUTOCOMMIT = 0), la serie de sentencias que vengan a continuación serán tratadas como una transacción, siendo almacenadas en la BD de forma fija hasta que se realice un COMMIT.

Comparando tablas transaccionales y no transaccionales editar

Las tablas transaccionales tienen las siguientes ventajas:

  • Mayor seguridad. Frente a caídas de servidor o fallos de hardware, pueden recuperarse los datos de forma automática o desde una copia de seguridad con el registro de transacciones.
  • Permite combinar varios comandos y aceptarlos a la vez con un COMMIT.
  • Pueden ignorar los cambios con un ROLLBACK.
  • Una actualización fallida hace que se deshagan los cambios. En tablas no transaccionales estos cambios son permanentes.
  • Proporcionan mejor concurrencia en tablas con varias actualizaciones concurrentes y lecturas simultáneas.

Las no transaccionales, en cambio:

  • Son más rápidas
  • Requieren menos espacio en disco.
  • Requieren menos memoria para realizar actualizaciones y modificaciones.

Es posible combinar tablas transaccionales y no transaccionales para aprovechar las ventajas de ambas. Al realizar esto se recomienda nunca mezclar diferentes motores de almacenamiento dentro de una transacción con AUTOCOMMIT desactivado.