Parámetros de aislamiento y propagación en @Transactional
En la anotación @Transactional de Spring, dos parámetros críticos definen el comportamiento de las transacciones de la base de datos: aislamiento y propagación . Este artículo explora cuándo y por qué debería considerar ajustar sus valores predeterminados.
Propagación
La propagación define cómo se relacionan las transacciones entre sí. Las opciones comunes incluyen:
Valor predeterminado: REQUERIDO
Aislamiento
El aislamiento define el contrato de datos entre transacciones. Evita ciertas inconsistencias de datos al especificar el nivel de visibilidad de los cambios de datos realizados por otras transacciones. Los niveles de aislamiento clave son:
Valor predeterminado: Varía según la base de datos (p. ej., REPEATABLE_READ para MariaDB)
Ejemplo del mundo real
Considere el problema de las lecturas sucias, donde una transacción puede leer cambios no confirmados realizados por otra transacción.
Thread 1 Thread 2 | | Write(x) | | | | Read(x) | | Rollback | | | Value (x) is now dirty (incorrect)
En este escenario, para evitar lecturas sucias, puede establecer el nivel de aislamiento en READ_COMMITTED y el nivel de propagación en REQUIRED. Esta combinación garantiza que las transacciones solo lean los datos que han sido confirmados por otras transacciones.
Personalizar transacciones
En el siguiente ejemplo, el método provideService siempre se ejecuta dentro de una nueva transacción, lo que garantiza que los cambios realizados por otras tareas simultáneas no interfieran con su ejecución:
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void provideService() {
repo1.retrieveFoo();
repo2.retrieveFoo();
}
Prueba del comportamiento de las transacciones
Para verificar el comportamiento de diferentes niveles de propagación, puede utilizar una prueba de Java:
@Test
public void testProvideService() {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
fooService.provideService();
transactionManager.rollback(status);
// Assert repository values are unchanged ...
}
Con REQUIRES_NEW, fooService.provideService() no se revertiría ya que operaba dentro de una transacción separada. Con REQUIRED, todo se revertirá.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3