Transacción en la base de datos MySQL-explicación detallada (1)

La transacción es la unidad más pequeña de una operación lógica. Específicamente, se refiere a un conjunto de sentencias sql en la base de datos. Este conjunto de sql debe ejecutarse con éxito antes de que se puedan confirmar los datos de la operación. Una vez que haya alguna Si una falla, debe revertirse y todas las operaciones SQL pierden su efecto.

En MySQL, la declaración SQL de la operación se envía automáticamente de forma predeterminada, y los métodos de transacción de inicio e inicio también se proporcionan para iniciar la transacción y realizar el compromiso manual (compromiso). Solo las operaciones que no están comprometidas se pueden revertir (deshacer) . A continuación, introduzcamos su uso específico y los "pozos" de operación a los que se debe prestar atención.
1. El parámetro
autocommit autocommit determina si los resultados se pueden enviar directamente después de ejecutar un fragmento de datos en MySQL. El valor predeterminado en MySQL es 1, lo que significa que el envío automático está activado. Cuando su valor se establece en 0, no será enviado automáticamente. Después de ejecutar el SQL, puede enviar manualmente o optar por revertir.
(1) Vea el valor de autocommit, ingrese a la base de datos MySQL y use

SELECT @@autocommit;

Para ver el valor de @autocommit relacionado

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

Como puede ver aquí, el valor = 1, lo que significa que la confirmación automática está activada de forma predeterminada, pero para implementar transacciones, debemos desactivar la confirmación automática.
(2) Establezca el valor de confirmación automática para desactivar el envío automático. usar

 set autocommit=0;

Establezca su valor en 0 para desactivar el envío automático.

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

De esta manera, después de ejecutar la instrucción sql, debemos enviarla manualmente, de lo contrario, el resultado no se modificará.
(3) El efecto de compromiso y retroceso

+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| curry |   15 | 10001 |
+-------+------+-------+

Esta es una tabla de usuario con campos de nombre, edad e identificación. Primero agregue datos a esta tabla

mysql> insert into user values('tom',10,2);
Query OK, 1 row affected (0.01 sec)

Aquí vemos que se ha agregado correctamente, pero ¿realmente se guardan los datos? seleccionar y echar un vistazo

mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| tom   |   10 |     2 |
| curry |   15 | 10001 |
+-------+------+-------+
3 rows in set (0.00 sec)

Descubrí que de hecho está en la tabla, pero no hay ningún envío aquí. ¿Qué sucede si lo deshago?

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| curry |   15 | 10001 |
+-------+------+-------+
2 rows in set (0.00 sec)

La información de Tom se ha ido. Esta es una forma de desactivar el compromiso automático estableciendo autocommit = 0, y luego implementar transacciones a través de la reversión. Pero hay un problema, es decir, después de configurar este parámetro, toda la base de datos debe enviarse manualmente al enviar operaciones, lo cual es muy problemático. MySQL proporciona de manera muy íntima los métodos de transacción de inicio e inicio, que realmente se dan cuenta de la operación de un conjunto de datos, ¡y la reversión manual del informe de error!
Dos, comience
antes de que desee escribir la declaración sql, úsela primero

mysql> begin;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into user values('tom',10,2);
Query OK, 1 row affected (0.01 sec)
mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| tom   |   10 |     2 |
| curry |   15 | 10001 |
+-------+------+-------+
3 rows in set (0.00 sec)

Insertado, ¿se puede revertir mediante reversión?

mysql> rollback;
Query OK, 0 rows affected (0.01 sec)
mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| curry |   15 | 10001 |
+-------+------+-------+

Para una reversión exitosa, el siguiente método de transacción de inicio es el mismo que este paso de uso.
Tres, el inicio de la transacción
está aquí, no retrocederemos directamente, después de que terminemos de operar el sql, lo enviemos manualmente y luego retrocedamos para ver el efecto.
Preferido usar iniciar transacción

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

Insertar datos

mysql> insert into user values('tom',10,2);
Query OK, 1 row affected (0.00 sec)
mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| tom   |   10 |     2 |
| curry |   15 | 10001 |
+-------+------+-------+
3 rows in set (0.00 sec)

Envío manual

mysql> commit;
Query OK, 0 rows affected (0.01 sec)

Luego retroceda y vea los resultados

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from user;
+-------+------+-------+
| name  | age  | id    |
+-------+------+-------+
| tom   |   10 |     2 |
| curry |   15 | 10001 |
+-------+------+-------+
3 rows in set (0.00 sec)

Se puede ver que una vez enviado, no se puede revertir. Antes de enviar, puede usar la operación de revertir para retirar sin retener el efecto sql. La siguiente sección presenta las cuatro características principales de las transacciones en detalle, el nivel de aislamiento de las transacciones y los problemas que pueden surgir.
Siguiente sección: Características de la transacción y problemas del nivel de aislamiento de la transacción en la base de datos MySQL

Supongo que te gusta

Origin blog.csdn.net/Wangdiankun/article/details/105868933
Recomendado
Clasificación