Una breve introducción a las transacciones en MySQL


Prefacio

Cuando un requisito de transacción requiere el uso de múltiples operaciones DML, el negocio se procesa como un todo. Durante el procesamiento, si hay algún fallo o excepción. Necesitamos volver al estado inicial donde comenzó el negocio. Si el procesamiento es exitoso, persistimos los datos en el disco. Un proceso así es una transacción . Las transacciones son atómicas, consistentes, aisladas y duraderas .

En pocas palabras, una transacción se refiere a un conjunto lógico de operaciones. Cada unidad que compone este conjunto de operaciones tiene éxito o falla durante la ejecución.

Utilice palabras clave: confirmar , revertir , punto de guardado


1. Características de las transacciones (ACID)

  1. Atomicidad
    significa que una transacción es un todo indivisible , y o ocurren todas las operaciones de transacción o no ocurre ninguna .
  2. Las transacciones de coherencia
    deben hacer que la base de datos pase de un estado de coherencia a otro . Por ejemplo, el importe total permanece sin cambios antes y después de la transferencia.
  3. Aislamiento: el aislamiento de transacciones
    significa que cuando varios usuarios acceden a la base de datos al mismo tiempo, las transacciones abiertas por la base de datos para cada usuario no pueden verse interferidas por los datos operativos de otras transacciones, y varias transacciones simultáneas deben aislarse entre sí.
  4. Durabilidad (Durabilidad)
    Una vez que se confirma una transacción, sus cambios en los datos de la base de datos son permanentes . Incluso si la base de datos falla, no tener ningún impacto en sus datos.

2. Transacciones MySQL

De forma predeterminada, cada declaración SQL ejecutada por MySQL es una transacción separada. Si necesita incluir varias declaraciones SQL en una transacción, debe iniciar y finalizar la transacción .

-- 开启事务:
start transaction-- 结束事务:
commit
rollback

Situación de inicio de transacción

  1. Conéctese a la base de datos y ejecute una instrucción DML para insertar, actualizar o eliminar
  2. Una vez finalizada la transacción anterior, se ingresó otra declaración DML.

El fin de la transacción

  1. Ejecutar declaración de confirmación o reversión
  2. Ejecute una declaración DDL, como la declaración de creación de tabla, en este caso, la declaración de confirmación se ejecutará automáticamente.
  3. Ejecute una declaración DDL, como la declaración de creación de tabla, en este caso, la declaración de confirmación se ejecutará automáticamente.
  4. Desconectarse de la base de datos
  5. Se ejecuta una declaración DML y la declaración falla. En este caso, se ejecutará una declaración de reversión para la declaración DML no válida.

1. Ejemplo: declaración SQL para implementar soporte de transacciones

Retroceder

START TRANSACTION; 
UPDATE account SET balance=balance-10000 WHERE id=1; 
SELECT * FROM account; UPDATE account SET balance=balance+10000 WHERE id=2; 
ROLLBACK;

entregar

START TRANSACTION; 
UPDATE account SET balance=balance-10000 WHERE id=1; 
SELECT * FROM account; 
UPDATE account SET balance=balance+10000 WHERE id=2;
COMMIT;

3. Situación de múltiples asuntos

1. Lectura sucia

La transacción A lee los datos que acaba de actualizar la transacción B, pero la transacción B se revierte. Esto hará que los datos leídos por la transacción A sean datos sucios, lo cual es una lectura sucia.

2. Lectura no repetible

La transacción A lee los mismos datos dos veces, pero la transacción B modifica y confirma el registro entre las dos veces, lo que hace que los datos leídos por la transacción A sean inconsistentes.

La diferencia con la lectura sucia es que la lectura sucia se produce cuando la transacción A lee los datos sucios no confirmados de la transacción B. Lectura no repetible significa que la transacción A lee los datos enviados por la transacción B.

3.Lectura fantasma

Después de que la transacción A completa la consulta de los datos, la transacción B realiza la operación de agregarle nuevos datos. Cuando la transacción A vuelve a consultar los datos, descubre que se han agregado nuevos registros sin ningún motivo. Esta es una lectura fantasma.

4. Comparación entre lectura fantasma y lectura no repetible

Lo mismo : todos son para otra transacción comprometida.

Diferencia : las lecturas no repetibles generalmente se dirigen al mismo registro, mientras que las lecturas fantasma se dirigen a varios registros. La lectura no repetible se centra en actualizar y eliminar, mientras que la lectura fantasma se centra en insertar.

Resumen : La base de datos evita que ocurran las situaciones anteriores estableciendo el nivel de aislamiento de la transacción .

4. Mecanismo de aislamiento

1. Clasificación de los mecanismos de aislamiento.

  • Leer no comprometido
  • leer comprometido
  • lectura repetible
  • Serializable _

1.1.1 Lectura no confirmada

Sin control de aislamiento , se pueden leer "datos sucios". Pueden ocurrir lecturas no repetibles y pueden ocurrir lecturas fantasmas.

1.1.2 Grado de presentación

No se permite la lectura de datos no confirmados en una transacción. El problema de las lecturas sucias se puede evitar , pero pueden producirse lecturas no repetibles y lecturas fantasma . Este nivel de aislamiento es el nivel de aislamiento predeterminado para la mayoría de las bases de datos ( excepto MySQL ).

1.1.3 Lectura repetible

Para evitar el problema de la lectura no repetible en el nivel de lectura confirmada. "Bloqueo exclusivo" en los registros que cumplen las condiciones en la transacción, para que otras transacciones no puedan modificar los datos operados por la transacción, lo que puede evitar problema de la lectura no repetible. Debido a que solo los datos de la operación están bloqueados, se producirán lecturas fantasma cuando otras transacciones inserten o eliminen datos . Este nivel de aislamiento es el nivel de aislamiento predeterminado de MySQL .

1.1.4 Serialización

Bloquee la tabla durante la transacción para que ninguna otra transacción pueda operar en los datos de la tabla (agregar, eliminar y modificar) antes del final de la transacción. Esto evita lecturas sucias, lecturas no repetibles y lecturas fantasmas, y es la más segura . Nivel de aislamiento . Pero debido a que esta operación está bloqueada, afectará seriamente el rendimiento .

punto importante:

  • Cuanto mayor sea el nivel del mecanismo de aislamiento , más seguros serán los datos y menor será el rendimiento.
  • La configuración del nivel de aislamiento debe realizarse antes de la transacción.

2.Operaciones relacionadas con el nivel de aislamiento en mysql

Ver el nivel de aislamiento de transacción actual : SELECT @@TX_ISOLATION

Cambie el nivel de aislamiento de transacción actual : ESTABLECER NIVEL DE AISLAMIENTO DE TRANSACCIÓN Uno de los cuatro niveles.

3.JDBC controla el nivel de aislamiento de las transacciones.

Interfaz de conexión:

TRANSACTION_READ_UNCOMMITTED: una constante que permite que se produzcan lecturas sucias, lecturas no repetibles y lecturas fantasmas.

TRANSACTION_READ_COMMITTED: Constante para evitar lecturas sucias; pueden ocurrir lecturas no repetibles y lecturas fantasmas

TRANSACTION_REPEATABLE_READ: constante para evitar lecturas sucias y lecturas no repetibles; pueden ocurrir lecturas fantasmas

TRANSACTION_SERIALIZABLE: Constantes para evitar que se produzcan lecturas sucias, lecturas no repetibles y lecturas fantasma

Método de configuración:

Connection.setTransactionIsolation(nivel int);


Supongo que te gusta

Origin blog.csdn.net/qq_45263520/article/details/123975923
Recomendado
Clasificación