¿Qué es una transacción MySQL? ?

Transacción MySQL

La transacción es una unidad lógica de ejecución del programa compuesta por una serie de operaciones para acceder y actualizar los datos del sistema.

  • Sintaxis de transacción

  • Características de la transacción

  • Simultaneidad de transacciones

  • Nivel de aislamiento de transacciones

  • La situación de bloqueo de diferentes niveles de aislamiento.

  • Compromiso implícito

     

 

1, la sintaxis de la transacción

  1. iniciar transacción; / comenzar;

  2. commit; Hacer la confirmación de modificación actual

  3. rollback; hace que se abandone la modificación actual

⼆, características ACID de las transacciones

  1. Originalidad (atomicidad)

    La originalidad de la transacción significa que la transacción debe ser una unidad de secuencia de operación original. Cada operación incluida en la transacción solo puede aparecer en uno de dos estados durante una ejecución

    • Todo ejecutado con éxito

    • Toda ejecución falló

    Una vez iniciada la transacción, todas las operaciones se realizan o no se realizan en absoluto. Es imposible detenerse en el enlace intermedio. Si ocurre un error durante la ejecución de la transacción, se revertirá al estado anterior al inicio de la transacción, y todas las operaciones parecerán no haber ocurrido. En otras palabras, los asuntos son un todo indivisible, al igual que el principio aprendido en química, es la unidad básica de la composición material.

     

  2. Consistencia

    La consistencia de una transacción significa que la ejecución de una transacción no puede destruir la integridad y consistencia de los datos de la base de datos. Antes y después de que se ejecute una transacción, la base de datos debe estar en un estado consistente.

    Por ejemplo, si transfiere dinero de la cuenta A a la cuenta B, es imposible deducir dinero de la cuenta A, pero la cuenta B no agrega dinero.

  3. Aislamiento

    El aislamiento de transacciones significa que en un entorno concurrente, las transacciones concurrentes están aisladas entre sí. En otras palabras, cuando diferentes transacciones operan sobre los mismos datos al mismo tiempo, cada transacción tiene su propio espacio de datos completo.

    Las operaciones internas de una transacción y los datos utilizados están aislados de otras transacciones concurrentes, y cada transacción ejecutada simultáneamente no puede interferir entre sí.

     

  4. Persistencia (duración)

    La durabilidad de una transacción significa que los datos de la base de datos deben guardarse de forma permanente después de que se confirme la transacción. Incluso si el sistema del servidor falla o el servidor se cae y otras fallas. Siempre que se reinicie la base de datos, debe poder restaurarla al estado después de que la transacción finalice correctamente.

Tres, problemas de concurrencia de transacciones

  • Lectura sucia: lee datos que no se han confirmado, la transacción A lee los datos actualizados de la transacción B, y luego B revierte la operación, luego los datos leídos por A son datos sucios.

  • Lectura no repetible: el mismo comando devuelve diferentes conjuntos de resultados (actualizaciones). La transacción A lee los mismos datos varias veces, y la transacción B actualiza y confirma los datos durante las lecturas múltiples de la transacción A, lo que provoca la transacción A al leer los mismos datos varias veces, los resultados no son consistentes.

  • Lectura fantasma: en el proceso de consulta repetida, la cantidad de datos cambia (insertar, eliminar).

Los usuarios de la tabla crean ( 
    ID int Primary Key AUTO_INCREMENT, 
    name VARCHAR (10), 
    Age int, 
    Account int 
) = Conjunto de caracteres predeterminado del motor InnoDB = utf8mb4; 
INSERT INTO los valores de los usuarios (nulo, 'John Doe', 25,10000), (nulo, 'John Doe', 20,100), (nulo, ' Wang Wu', 23,0); 
operación de servicios básicos 
1. Iniciar transacción; / el comienzo; 
2. el compromiso; confirmación de que la modificación actual 
3. deshacer; tal que el la modificación fue abandonada

Cuarto, nivel de aislamiento de transacciones

Nivel de aislamiento de transacciones Lectura sucia No repetible Lectura fantasma
Lectura no confirmada (READ_UNCOMMITTED) permitir permitir permitir
Se ha enviado la lectura (READ_COMMITTED) Prohibir permitir permitir
Lectura repetible (REPEATABLE_READ) Prohibir Prohibir tal vez
Lectura secuencial (SERIALIZABLE) Prohibir Prohibir Prohibir

Los cuatro niveles de aislamiento de transacciones son de arriba a abajo: cuanto mayor es el nivel, peor es la concurrencia y mayor es la seguridad. El nivel predeterminado de datos generales se lee para enviar o se lee repetidamente.

 

Ver el nivel de aislamiento de las transacciones en la sesión actual

seleccione @@ tx_isolation; 
+ ----------------- + 
| @@ tx_isolation | 
+ ----------------- + 
| LECTURA REPETIBLE | 
+ ----------------- + 
1 fila en conjunto, 1 advertencia (0.00 seg)

Establecer el nivel de aislamiento de transacciones en la sesión actual

mysql> establecer el nivel de aislamiento de la transacción de sesión leído no confirmado; 
Query OK, 0 filas afectadas (0.00sec) 
-读未提交
conjunto sesión de nivel de aislamiento de lectura no confirmada; 
-读已提交READ_COMMITTED 
conjunto nivel de aislamiento de lectura confirmada sesión; 
-可重复读REPEATABLE_READ 
conjunto de transacciones sesión nivel de aislamiento de lectura repetible; 
-顺序读SERIALIZABLE 
conjunto SERIALIZABLE sesión de nivel de aislamiento;

1. Leer sin confirmar (READ_UNCOMMITTED)

Lectura no confirmada, este nivel de aislamiento permite lecturas sucias y su nivel de aislamiento es el más bajo. En otras palabras, si una transacción está procesando ciertos datos y los actualiza, pero la transacción no se ha completado al mismo tiempo, entonces la transacción no se ha comprometido; al mismo tiempo, se permite que otra transacción acceda a los datos.

Ejemplo de lectura sucia :

Los siguientes escenarios pueden ocurrir cuando la transacción A y la transacción B se ejecutan al mismo tiempo:

hora Transacción A (depósito) Transacción B (Retiro)
T1 Iniciar transacción ——
T2 —— Iniciar transacción
T3 —— Consultar el saldo (1000 yuanes)
T4 —— Retirar 1.000 yuanes (el saldo es 0 yuanes)
T5 Consultar el saldo (0 yuanes) ——
T6 —— Cancelar la transacción (restaurar el saldo 1.000 yuanes)
T7 Depositar 500 yuanes (el saldo es de 500 yuanes) ——
T8 Confirmar transacción ——

El saldo debe ser de 1500 yuanes. Por favor mire el punto de tiempo T5. El saldo de la Transacción A consultado en este momento es 0. Estos datos son datos sucios. Es causado por la Transacción B. Obviamente, la transacción no está aislada.

2. Se ha enviado la lectura (READ_COMMITTED)

La lectura comprometida es cuando se ejecuta una transacción diferente, solo se pueden obtener los datos comprometidos. De esta manera, no habrá lecturas sucias arriba. Pero al realizar la misma lectura en la misma transacción, el resultado no es consistente

Ejemplo de lectura no repetible

hora Transacción A (depósito) Transacción B (Retiro)
T1 Iniciar transacción ——
T2 —— Iniciar transacción
T3 —— Consultar el saldo (1000 yuanes)
T4 Consultar el saldo (1000 yuanes) ——
T5 —— Retirar 1.000 yuanes (el saldo es 0 yuanes)
T6 —— Confirmar transacción
T7 Consultar el saldo (0 yuanes) ——
T8 Confirmar transacción ——

De hecho, la transacción A no hizo nada más que consultar dos veces. Como resultado, el dinero cambió de 1000 a 0. Este es el problema de la lectura no repetible.

3. Lectura repetible (REPEATABLE_READ)

La lectura repetible es para garantizar que cuando los mismos datos se leen varias veces durante el procesamiento de la transacción, el valor de los datos sea coherente con la hora de inicio de la transacción. Por lo tanto, el nivel de transacción limita las lecturas no repetibles y las lecturas sucias, pero pueden producirse datos de lectura fantasma.

Lectura fantasma

La lectura fantasma se refiere a la misma operación de transacción, y la lectura del mismo elemento de datos se realiza en los dos períodos de tiempo antes y después, y pueden producirse resultados inconsistentes.

Evento de actualización extraño

hora Transacción A (depósito) Transacción B (Retiro)
T1 Iniciar transacción ——
T2 Consultar todos los actuales Iniciar transacción
T3 —— Insertar un dato
T4 Consultar todos los datos actuales Confirmar transacción
T5 Realizar cambios de alcance ——
T6 Consultar todos los datos actuales ——
T7 Confirmar transacción ——

4. Lectura secuencial (SERIALIZABLE)

La lectura secuencial es el nivel de aislamiento de transacciones más estricto. Requiere que todas las transacciones se pongan en cola y se ejecuten secuencialmente, es decir, las transacciones solo se pueden procesar una por una y no pueden ser concurrentes.

Cinco, la situación de bloqueo de diferentes niveles de aislamiento.

  1. Lectura no confirmada (RU): hay bloqueos de alto nivel y no bloqueos de espacio. La diferencia entre este y RC es que puede consultar datos no enviados.

  2. Lectura confirmada (RC): hay bloqueos de alto nivel, no hay bloqueos de espacios y no se pueden leer los datos no confirmados.

  3. 可重复读(RR):有⾏级的锁,也有间隙锁,每次读取的数据都是⼀样的,并且没有幻读的情况。

  4. 序列化(S):有⾏级锁,也有间隙锁,读表的时候,就已经上锁了

六,隐式提交

DQL:查询语句

DML:写操作(添加,删除,修改)

DDL:定义语句(建库,建表,修改表,索引操作,存储过程,视图)

DCL:控制语⾔(给⽤户授权,或删除授权)

 

DDL(Data Define Language):都是隐式提交。

隐式提交:执⾏这种语句相当于执⾏commit; DDL

参考:https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html

Supongo que te gusta

Origin blog.csdn.net/weixin_43515837/article/details/112004537
Recomendado
Clasificación