transacción [MySQL]

1. Introducción

La transacción es un concepto muy importante en el sistema de gestión de bases de datos. Este artículo presenta principalmente las cuatro características de la transacción, los posibles problemas causados ​​por la transacción concurrente y el nivel de aislamiento de la transacción.

2. Introducción comercial

Una transacción es una colección de operaciones. Es una unidad de trabajo indivisible. Una transacción enviará o revocará solicitudes de operación al sistema como un todo, es decir, estas operaciones tendrán éxito o fallarán al mismo tiempo .

Un caso típico de escenarios de uso de transacciones es la transferencia. Cualquier error en la transferencia no está permitido, y un poco causará grandes pérdidas. Por ejemplo, el usuario A transfiere 200 yuanes al usuario B en este momento. Luego, la operación realizada en la base de datos es para permitir que el saldo del usuario A se reduzca en 200, y el saldo del usuario B aumente en 200.

Si no se utiliza la transacción, pueden ocurrir los siguientes problemas: después de que el saldo del usuario A se reduce en 200, cuando se ejecuta la base de datos para agregar 200 al saldo del usuario B, la base de datos se bloquea o se produce una situación anormal, y el El saldo del usuario B no agrega 200. Entonces A perderá 200 yuanes sin ningún motivo. En este momento, el problema es muy grande.
Pero si se usa la transacción, el saldo del usuario A se reduce en 200, y el saldo de el usuario B se incrementa en 200. Estas dos operaciones son un todo. El resultado es dos, ya sea exitoso o fallido. Entonces los problemas anteriores se pueden tratar fácilmente. Si ocurren los problemas anteriores, entonces la base de datos revertirá la transacción en este tiempo, que puede entenderse como una operación de deshacer Restaurar los datos Antes de la ejecución de datos Esto muestra la importancia de las transacciones.

3. Operaciones de transacción

Hay tres operaciones principales para las operaciones de transacción: abrir una transacción, confirmar una transacción y revertir una transacción.

Hay tres formas de iniciar una transacción en MySQL:

使用 BEGIN语句可以手动开启
使用 SET AUTOCOMMIT=0/1 语句(0为手动提交,1为默认提交)
使用 START TRANSACTION语句

Confirmar y revertir transacciones:

COMMIT; # 提交事务
ROLLBACK; # 回滚事务

Las transacciones de MySQL se confirman de forma predeterminada, es decir, cuando se ejecuta una instrucción DML, MySQL confirma implícitamente la transacción.

Tome el ejemplo de la transferencia que acabamos de mencionar: de hecho, el paso principal es modificar el saldo del usuario A y del usuario B en dos pasos. Por supuesto, si persigue el rigor, puede juzgar si el saldo es mayor que el monto de la transferencia anterior. la transferencia No lo haré aquí Escribió
El saldo del usuario A y el usuario B en el estado inicial:
inserte la descripción de la imagen aquí
A continuación, usamos transacciones para tratar los problemas mencionados anteriormente que pueden surgir durante el proceso de ejecución de la base de datos:
inserte la descripción de la imagen aquí
por ejemplo, cambié el declaración SQL a una incorrecta aquí para simular una situación de error de base de datos.
Después de la ejecución Después de la declaración SQL, vemos que el saldo del usuario A ha cambiado. Pero el saldo del usuario B no ha cambiado.
inserte la descripción de la imagen aquí
En este momento, los datos han sido incorrecto. Revertiremos la transacción para restaurar los datos.
inserte la descripción de la imagen aquí
Después de revertir la transacción, podemos ver que los datos del usuario A y el usuario B se han restaurado a los datos antes de la modificación.

4. Cuatro características de las transacciones

Las transacciones tienen las siguientes cuatro propiedades, también conocidas como propiedades ACID:

  1. Atomicidad : una transacción es una operación atómica y no se puede dividir. Todos los pasos de la operación se completan o no se completan, y no habrá una finalización parcial. Si alguna operación falla, la transacción se revertirá al estado anterior a su inicio y todos los datos modificados se desharán.

  2. Consistencia : Antes y después de la ejecución de la transacción, el estado de la base de datos debe ser consistente . El estado de la base de datos antes de la ejecución de la transacción es un estado legal y el estado de la base de datos después de la ejecución también debe ser un estado legal. En otras palabras, no habrá contradicciones ni conflictos durante la ejecución de la transacción, lo que garantiza la integridad y corrección de los datos.

  3. Aislamiento : cuando se ejecutan varias transacciones al mismo tiempo , las operaciones de cada transacción deben aislarse de las operaciones de otras transacciones sin interferir entre sí . Las modificaciones hechas por cada oficina deben ser independientes de las modificaciones hechas por otras oficinas, para que no haya interferencia mutua. Se garantiza que cada transacción se ejecuta de forma independiente sin causar problemas de concurrencia.

  4. Durabilidad : una vez que se confirma una transacción , sus modificaciones se guardarán permanentemente en la base de datos y no se perderán incluso si el sistema falla. La persistencia de los datos garantiza que los resultados de confirmación de transacciones no se revocarán y se pueden recuperar incluso en caso de falla o bloqueo del sistema.

Las cuatro características de las transacciones aseguran la confiabilidad, consistencia y durabilidad del proceso de operación de la base de datos y son un medio importante para asegurar la integridad y exactitud de los datos.

5. Problemas con transacciones concurrentes

Las transacciones son la unidad básica de control de concurrencia , y las transacciones concurrentes pueden destruir las características ACID de las transacciones. Las transacciones concurrentes pueden tener los siguientes tres problemas:

  • Lectura sucia : lectura sucia significa que una transacción lee datos no confirmados cuando lee los datos de otra transacción no confirmada. Si otra transacción retrocede, los datos leídos por esta transacción no son válidos. Las lecturas sucias pueden generar inconsistencias en los datos.
  • Lectura no repetible : lectura no repetible significa que una transacción lee el mismo conjunto de datos varias veces, pero durante este período, otra transacción actualiza este conjunto de datos, lo que genera inconsistencias en los datos leídos dos veces por la primera transacción. Las lecturas no repetibles pueden generar inconsistencias en los datos.
  • Lectura fantasma : la lectura fantasma significa que después de que una transacción lee un conjunto de datos, otra transacción inserta una nueva pieza de datos, lo que hace que la primera transacción lea el mismo conjunto de datos nuevamente y encuentre que los datos han aumentado en una pieza, creando así una ilusion Las lecturas fantasma pueden generar inconsistencias en los datos.

Los tres problemas anteriores son causados ​​por la ejecución simultánea de múltiples transacciones. Las soluciones a estos problemas incluyen:

  1. Bloqueo : Al bloquear los datos compartidos, se garantiza que el acceso de cada transacción a los datos compartidos sea mutuamente exclusivo, resolviendo los problemas de lecturas sucias y lecturas no repetibles.
  2. MVCC (Control de concurrencia de múltiples versiones) : al registrar la información de la versión de los datos en la vista de cada transacción, se garantiza que los datos leídos por cada transacción sean consistentes y se resuelven los problemas de lecturas no repetibles y lecturas fantasma.
  3. Serialización : al ejecutar transacciones concurrentes en serie, se garantiza que cada transacción se ejecutará de forma independiente sin problemas de concurrencia. Pero la serialización reducirá la simultaneidad y el rendimiento del sistema, por lo que no es adecuado para escenarios de alta simultaneidad.

6. Nivel de aislamiento de transacciones

El nivel de aislamiento de una transacción se refiere al grado de aislamiento entre múltiples transacciones simultáneas. MySQL admite 4 niveles de aislamiento, de bajo a alto:

  1. Lectura no confirmada (Lectura no confirmada): el nivel de aislamiento más bajo que permite que una transacción lea datos no confirmados por otra transacción, lo que puede causar lecturas sucias, lecturas no repetibles y lecturas fantasma.

  2. Lectura confirmada (Read Committed): permite que una transacción lea datos confirmados por otra transacción, lo que evita problemas de lectura sucia , pero aún puede causar problemas de lectura no repetible y lectura fantasma.

  3. Lectura repetible (Lectura repetible): Asegúrese de que cuando el mismo conjunto de datos se lea varias veces en la misma transacción, los datos leídos sean siempre consistentes, evitando lecturas sucias y lecturas no repetibles , pero aún pueden causar lecturas fantasma.

  4. Serializable: el nivel de aislamiento más alto, que evita todos los problemas de simultaneidad mediante la ejecución de transacciones concurrentes en serie , pero conduce a una degradación del rendimiento.

nivel de aislamiento lectura sucia lectura no repetible Publicación por entregas
Leer sin confirmar
Lectura comprometida ×
Lectura repetible × ×
Serializable × × ×

Ver el nivel de aislamiento de transacciones:

select @@transaction_isolatio;

Establezca el nivel de aislamiento de la transacción:

SET [SESSION/GLOBAL] TRANSACTION ISOLATION LEVEL <隔离级别>;
# SESSION: 针对当前的会话窗口有效
# GLOBAL: 对所有客户端的会话窗口有效

Cuanto mayor sea el nivel de aislamiento, mayor será el grado de aislamiento entre sí, pero también puede generar problemas como la degradación del rendimiento y los interbloqueos . En aplicaciones prácticas, es necesario seleccionar un nivel de aislamiento apropiado de acuerdo con los diferentes requisitos comerciales y el rendimiento del sistema. El nivel de aislamiento predeterminado de MySQL es lectura repetible.

7. Resumen

Las transacciones son muy importantes para la corrección, confiabilidad, integridad y seguridad de los sistemas de administración de bases de datos y son el medio clave para garantizar la calidad de los datos. Comprenda los problemas que pueden causar las transacciones concurrentes y lo que significan estos problemas, y aprenda a establecer razonablemente el nivel de aislamiento de las transacciones para tratar los problemas que pueden causar las transacciones concurrentes.

¡Gracias por mirar! ¡Espero que este artículo pueda ayudarlo!
Columna: "Speedthrough MySQL" se actualiza constantemente, ¡bienvenido a suscribirse!
"¡Deseo alentarlo y progresar de la mano!"
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_63463510/article/details/130534523
Recomendado
Clasificación