Explicación detallada del nivel de aislamiento de las transacciones Spring ~ Transacciones Spring Parte 2

Nivel de aislamiento de transacciones de primavera

¿Por qué aislar las transacciones? Sin aislamiento de transacciones, cuando varias transacciones son simultáneas, se producirán problemas como actualizaciones perdidas, lecturas sucias, lecturas no repetibles y lecturas fantasma.

1. No hay problemas causados ​​por el aislamiento de transacciones.

1. Actualización perdida

Cuando dos o más transacciones actualizan la misma fila de registros, se produce una pérdida de actualización. Se puede dividir en cobertura de reversión y cobertura de confirmación.

Por ejemplo: la transacción T1 consulta datos, la transacción T2 consulta datos, la transacción T1 modifica los datos y los envía, y la transacción T2 modifica los datos. En este momento, la transacción T2 se confirma o revierte, lo que hará que los datos modificados por la transacción T1 sean sobrescrito.

2. Lectura sucia

La lectura sucia también se denomina lectura de datos no válidos. Una transacción lee datos que otra transacción aún no ha confirmado.

Por ejemplo, la transacción T1 modifica una fila de datos pero aún no la ha enviado. En este momento, la transacción T2 lee los datos modificados por la transacción T1. Luego, la transacción T1 retrocede por algún motivo, por lo que los datos leídos por la transacción T2 están sucios.

3. Lectura no repetible

Significa que varias consultas en la misma fila de datos dentro de la misma transacción arrojan resultados diferentes.

Por ejemplo, la transacción T1 consulta una determinada fila de datos por primera vez y luego la transacción T2 modifica un determinado campo de la fila de datos y envía los datos. Cuando la transacción T1 consulta la fila de datos por segunda vez, obtiene los resultados modificados de la transacción T2.

La diferencia entre lectura no repetible y lectura sucia es que la lectura sucia lee datos no confirmados, mientras que la lectura no repetible lee datos confirmados. Por supuesto, la lectura no repetible no es un problema en algunos casos, a veces solo queremos consultar el estado más reciente de los datos en la misma transacción.

4. Lectura fantasma

La lectura fantasma también se llama lectura virtual. Varias consultas de la misma declaración SQL en la misma transacción darán como resultado diferentes cantidades de datos (número de elementos).

Por ejemplo, la transacción T1 modifica un elemento de datos en todas las filas de una tabla de "1" a "2". En este momento, la transacción T2 inserta una fila de elementos de datos en la tabla y el valor del elemento de datos sigue siendo "1". " y enviado a la base de datos. Si el usuario que opera la transacción T1 mira los datos que acaba de modificar, encontrará que todavía hay una fila que no ha sido modificada, de hecho, esta fila se agregó de la transacción T2, es como una alucinación. Esta es una lectura fantasma.

2. Utilice el nivel de aislamiento de la transacción para resolver el problema.

Uso del nivel de aislamiento

La anotación @Transactional establece el nivel de aislamiento de la transacción a través del atributo de aislamiento

@Transactional(isolation=Isolation.DEFAULT)
public void methodA(){
    
    
// 业务逻辑 
// 操作数据库
}

3. El atributo de aislamiento tiene los cinco valores siguientes:

1 、 PREDETERMINADO

Este es el valor predeterminado, lo que significa que es coherente con el nivel de aislamiento establecido por la base de datos conectada.

2 、 READ_UNCOMMITTED

Lectura no confirmada (se producirán lecturas sucias, lecturas no repetibles, lecturas fantasmas) y básicamente no se utilizan

Bajo la premisa de operar en la misma fila de datos, una transacción de lectura permite otras transacciones de lectura y escritura. Una transacción de escritura no confirmada prohíbe otras transacciones de escritura pero permite otras transacciones de lectura. Este nivel de aislamiento puede evitar la pérdida de actualizaciones, pero no puede evitar lecturas sucias, lecturas no repetibles y lecturas fantasma. Este nivel de aislamiento se puede lograr mediante un "bloqueo de escritura exclusivo".

3、LEER_COMMITTED

Lectura confirmada (se producirán lecturas no repetibles y lecturas fantasmas)

Según la premisa de operar la misma fila de datos, las transacciones de lectura permiten otras transacciones de lectura y escritura, y las transacciones de escritura no confirmadas prohíben otras transacciones de lectura y escritura. Este nivel de aislamiento puede evitar la pérdida de actualizaciones y lecturas sucias, pero no puede evitar lecturas no repetibles ni lecturas fantasma. Este nivel de aislamiento se puede lograr mediante "bloqueos de lectura compartidos transitorios" y "bloqueos de escritura exclusivos".

4、REPEATABLE_READ

Lectura repetible (puede ocurrir lectura fantasma)

Según la premisa de operar la misma fila de datos, una transacción de lectura prohíbe otras transacciones de escritura (pero permite otras transacciones de lectura), y una transacción de escritura no confirmada prohíbe otras transacciones de lectura y escritura. Este nivel de aislamiento puede evitar la pérdida de actualizaciones, lecturas sucias y lecturas no repetibles, pero no puede evitar lecturas fantasma. Este nivel de aislamiento se puede lograr mediante "bloqueos de lectura compartidos" y "bloqueos de escritura exclusivos".

5、SERIALIZABLE

Serializable

Proporcionar un estricto aislamiento de transacciones. Requiere que las transacciones se ejecuten en serie, y las transacciones solo se pueden ejecutar una tras otra y no se pueden ejecutar al mismo tiempo. Este nivel de aislamiento evita la pérdida de actualizaciones, lecturas sucias, lecturas no repetibles y lecturas fantasma. Si la serialización de transacciones no se puede lograr únicamente mediante el "bloqueo a nivel de fila", se deben utilizar otros mecanismos para garantizar que la transacción que acaba de ejecutar la operación de consulta no acceda a los datos recién insertados. Este nivel de aislamiento de transacciones es ineficiente y consume el rendimiento de la base de datos, por lo que generalmente no se utiliza.

4. Ampliación:

1. Nivel de aislamiento de transacciones predeterminado de bases de datos comunes

Oracle, el nivel de aislamiento predeterminado de Sql Server es READ_COMMITTED,
El nivel de aislamiento predeterminado de Mysql es REPEATABLE_READ.

2. La configuración del nivel de aislamiento solo es efectiva para la conexión actual.

Para usar la ventana de comandos de Mysql, una ventana es equivalente a una conexión, y el nivel de aislamiento establecido por la ventana actual solo es efectivo para las transacciones en la ventana actual; para bases de datos operativas JDBC, un objeto Conexión es equivalente a un enlace, y para Objeto de conexión El nivel de aislamiento establecido solo es válido para objetos de conexión y no tiene nada que ver con otros objetos de conexión vinculados.

3. Se debe configurar el nivel de aislamiento de la base de datos antes de iniciar la transacción.

Transacción en mybatis:
Implementa el envío y la reversión de transacciones a través del método de confirmación y el método de reversión del objeto sqlSession.

4. Configuraciones SQL comunes para niveles de aislamiento

Ver el nivel de aislamiento de transacciones actual: seleccione @@transaction_isolation;
Establezca el nivel de aislamiento de transacciones de la sesión actual: establezca el nivel de aislamiento de transacciones de sesión XXX (nivel de aislamiento);
Establezca el nivel de aislamiento de transacciones global actual: establezca el nivel de aislamiento de transacciones global XXX (nivel de aislamiento);

Supongo que te gusta

Origin blog.csdn.net/qq_42547733/article/details/128705149
Recomendado
Clasificación