English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Transacciones MySQL

MySQL se utiliza principalmente para procesar datos con gran volumen y alta complejidad. Por ejemplo, en un sistema de gestión de personal, al eliminar a un empleado, es necesario eliminar tanto la información básica del empleado como la información relacionada con él, como la bandeja de entrada, los artículos, etc., por lo que estas sentencias de operaciones de base de datos constituyen una transacción!

  • En MySQL, solo las bases de datos o tablas que usan el motor de base de datos Innodb admiten transacciones.

  • El procesamiento de transacciones se puede utilizar para mantener la integridad de la base de datos, garantizando que las sentencias SQL en lote se ejecuten o no se ejecuten en absoluto.

  • Una transacción se utiliza para gestionar sentencias insert, update, delete

En general, una transacción debe cumplir4Una condición (ACID):: Atomicidad (AAtomicidad, o también denominada in divisible), consistencia (CConsistencia), aislación (IIsolación, también conocida como independencia), persistencia (DU

  • Atomicidad:Todas las operaciones en una transacción (transaction) deben completarse o no completarse en absoluto, sin terminar en algún punto intermedio. Si ocurre un error durante la ejecución de una transacción, se revertirá (Rollback) al estado antes de que la transacción comenzara, como si la transacción nunca se hubiera ejecutado.

  • Consistencia:Antes de comenzar y después de finalizar la transacción, la integridad de la base de datos no se ha visto comprometida. Esto significa que los datos introducidos deben cumplir completamente todas las reglas predeterminadas, lo que incluye la precisión, la coherencia y que la base de datos pueda completar automáticamente las tareas previstas.

  • Aislamiento:La capacidad de la base de datos para permitir múltiples transacciones concurrentes que lean y escriban y modifiquen sus datos, el aislamiento puede evitar que las transacciones concurrentes causen incoherencias debido a la ejecución cruzada. El aislamiento de las transacciones se divide en diferentes niveles, incluyendo Read uncommitted (Leer no comprometido), Read committed (Leer comprometido), Repeatable read (Leer repetible) y Serializable (Serializable).

  • Persistencia:Después de que se complete el manejo de transacciones, las modificaciones en los datos son permanentes, incluso si ocurre un fallo del sistema no se perderán.

Bajo la configuración predeterminada de la línea de comandos de MySQL, todas las transacciones son automáticamente comprometidas, es decir, después de ejecutar una sentencia SQL, se ejecutará inmediatamente la operación COMMIT. Por lo tanto, para abrir explícitamente una transacción, debe usar el comando BEGIN o START TRANSACTION, o ejecutar el comando SET AUTOCOMMIT=0 para prohibir el uso del auto-commit de la sesión actual.

Sentencias de control de transacción:

  • BEGIN o START TRANSACTION para abrir explícitamente una transacción;

  • COMMIT también puede usarse como COMMIT WORK, aunque ambos son equivalentes. COMMIT comprometerá la transacción y hará que todas las modificaciones realizadas en la base de datos se vuelvan permanentes;

  • ROLLBACK también puede usarse como ROLLBACK WORK, aunque ambos son equivalentes. El rollback finalizará la transacción del usuario y anulará todas las modificaciones no comprometidas en curso;

  • SAVEPOINT identifier, el SAVEPOINT permite crear un punto de salvaguarda en una transacción, en una transacción puede haber múltiples SAVEPOINT;

  • RELEASE SAVEPOINT identifier para eliminar un punto de salvaguarda de la transacción, cuando no se especifica un punto de salvaguarda, la ejecución de la sentencia lanzará una excepción;

  • ROLLBACK TO identifier para volver la transacción a un punto de marcador;

  • SET TRANSACTION se utiliza para establecer el nivel de aislamiento de la transacción. El motor de almacenamiento InnoDB proporciona niveles de aislamiento de transacción como READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ y SERIALIZABLE.

El manejo de transacciones en MYSQL se realiza principalmente de dos formas:

1Utilice BEGIN, ROLLBACK, COMMIT para implementar

  • BEGIN Iniciar una transacción

  • ROLLBACK Reversión de transacción

  • COMMIT  Confirmación de transacción

2、cambiar directamente el modo de transacción automática de MySQL con SET:

  • SET AUTOCOMMIT=0   Desactivar la transacción automática

  • SET AUTOCOMMIT=1 Activar la transacción automática

mysql> use w3codebox;
Base de datos cambiada
mysql> CREATE TABLE w3codebox_transaction_test(id int(5)) engine=innodb; # Crear tabla de datos
Query OK, 0 filas afectadas (0.04 sec)
 
mysql> select * from w3codebox_transaction_test;
Conjunto vacío (0.01 sec)
 
mysql> begin; # Comienzo de la transacción
Query OK, 0 filas afectadas (0.00 sec)
 
mysql> insert into w3codebox_transaction_test value(5);
Query OK, 1 filas afectadas (0.01 sec)
 
mysql> insert into w3codebox_transaction_test value(6);
Query OK, 1 filas afectadas (0.00 sec)
 
mysql> commit; # Completar la transacción
Query OK, 0 filas afectadas (0.01 sec)
 
mysql> select * from w3codebox_transaction_test;
+------+
| id |
+------+
| 5    |
| 6    |
+------+
2 filas en conjunto (0.01 sec)
 
mysql> begin; # Comienzo de la transacción
Query OK, 0 filas afectadas (0.00 sec)
 
mysql> insert into w3codebox_transaction_test values(7);
Query OK, 1 filas afectadas (0.00 sec)
 
mysql> rollback; # Deshacer
Query OK, 0 filas afectadas (0.00 sec)
 
mysql> select * from w3codebox_transaction_test; # Debido a que se deshace, los datos no se insertaron
+------+
| id |
+------+
| 5    |
| 6    |
+------+
2 filas en conjunto (0.01 sec)
 
mysql>

Ejemplo de transacción en PHP

<?php
$dbhost = 'localhost';  // Dirección del servidor de mysql
$dbuser = 'root';            // Nombre de usuario mysql
$dbpass = '123456';          // Nombre de usuario y contraseña de mysql
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
    die('Fallo de conexión: ' . mysqli_error($conn));
}
// Establecer codificación, evitar caracteres chinos ilegales
mysqli_query($conn, "set names utf8);
mysqli_select_db( $conn, 'w3codebox' );
mysqli_query($conn, "SET AUTOCOMMIT=0"); // Establecer no automático de envío, ya que MYSQL se ejecuta inmediatamente por defecto
mysqli_begin_transaction($conn);            // Definir inicio de transacción
 
if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(8)"))
{
    mysqli_query($conn, "ROLLBACK");     // Rollback si falla la ejecución
}
 
if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(9)"))
{
    mysqli_query($conn, "ROLLBACK");      // Rollback si falla la ejecución
}
mysqli_commit($conn);            //Ejecutar transacción
mysqli_close($conn);
?>