MySQLi - Transacciones

Una transacción es un grupo secuencial de operaciones de manipulación de bases de datos, que se realiza como si fuera una sola unidad de trabajo. En otras palabras, una transacción nunca estará completa a menos que cada operación individual dentro del grupo sea exitosa. Si alguna operación dentro de la transacción falla, toda la transacción fallará.

Prácticamente, agrupará muchas consultas SQL en un grupo y las ejecutará todas juntas como parte de una transacción.

Propiedades de las transacciones

Las transacciones tienen las siguientes cuatro propiedades estándar, generalmente denominadas por el acrónimo ACID:

  • Atomicity- asegura que todas las operaciones dentro de la unidad de trabajo se completen con éxito; de lo contrario, la transacción se aborta en el punto de falla y las operaciones anteriores se revierten a su estado anterior.

  • Consistency - asegura que la base de datos cambia correctamente de estado tras una transacción confirmada con éxito.

  • Isolation - permite que las transacciones operen de forma independiente y transparente entre sí.

  • Durability - asegura que el resultado o efecto de una transacción comprometida persista en caso de falla del sistema.

En MySQL, las transacciones comienzan con la instrucción BEGIN WORK y terminan con una instrucción COMMIT o ROLLBACK. Los comandos SQLi entre las declaraciones inicial y final forman la mayor parte de la transacción.

COMMIT y ROLLBACK

Estas dos palabras clave Commit y Rollback se utilizan principalmente para transacciones MySQL.

  • Cuando se completa una transacción exitosa, se debe emitir el comando COMMIT para que los cambios en todas las tablas involucradas surtan efecto.

  • Si ocurre una falla, se debe emitir un comando ROLLBACK para devolver cada tabla referenciada en la transacción a su estado anterior.

Puede controlar el comportamiento de una transacción configurando la variable de sesión llamada AUTOCOMMIT. Si AUTOCOMMIT se establece en 1 (el valor predeterminado), entonces cada instrucción SQL (dentro de una transacción o no) se considera una transacción completa y se confirma de manera predeterminada cuando finaliza. Cuando AUTOCOMMIT se establece en 0, al emitir el comando SET AUTOCOMMIT = 0, la serie subsiguiente de instrucciones actúa como una transacción y no se compromete ninguna actividad hasta que se emita una instrucción COMMIT explícita.

Puede ejecutar estos comandos SQL en PHP usando mysqli_query() función.

Ejemplo genérico de transacción

Esta secuencia de eventos es independiente del lenguaje de programación utilizado; la ruta lógica se puede crear en cualquier idioma que utilice para crear su aplicación.

Puede ejecutar estos comandos SQL en PHP usando mysqli_query() función.

  • Comience la transacción emitiendo un comando SQL BEGIN WORK.

  • Emita uno o más comandos SQL como SELECT, INSERT, UPDATE o DELETE.

  • Compruebe que no haya ningún error y que todo esté de acuerdo con su requerimiento.

  • Si hay algún error, emita el comando ROLLBACK; de lo contrario, emita un comando COMMIT.

Tipos de tablas seguras para transacciones en MySQLi

No puede utilizar transacciones directamente, puede hacerlo, pero no serían seguras ni garantizadas. Si planea usar transacciones en su programación MySQLi, entonces necesita crear sus tablas de una manera especial. Hay muchos tipos de tablas que admiten transacciones, pero la más popular esInnoDB.

El soporte para tablas InnoDB requiere un parámetro de compilación específico al compilar MySQLi desde la fuente. Si su versión de MySQLi no es compatible con InnoDB, solicite a su proveedor de servicios de Internet que cree una versión de MySQLi compatible con los tipos de tablas InnoDB o descargue e instale la distribución binaria MySQL-Max para Windows o Linux / UNIX y trabaje con el tipo de tabla en un entorno de desarrollo.

Si su instalación de MySQLi admite tablas InnoDB, simplemente agregue un TYPE = InnoDBdefinición a la declaración de creación de la tabla. Por ejemplo, el siguiente código crea una tabla InnoDB llamada tutorials_innodb -

[email protected]# mysql -u root -p;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> create table tutorials_innodb
   -> (
   -> tutorial_author varchar(40) NOT NULL,
   -> tutorial_count  INT
   -> ) TYPE = InnoDB;
Query OK, 0 rows affected (0.02 sec)

Consulte el siguiente enlace para saber más sobre InnoDB

Puede utilizar otros tipos de tablas como GEMINI o BDB, pero depende de su instalación si admite estos dos tipos.