Propiedades de propagación de transacciones en Spring
Cuando utilices Spring, utilizarás principalmente sus transacciones declarativas. Simplemente configure algunas reglas en el archivo de configuración y use la función AOP de Spring para manejar fácilmente los problemas de transacción, lo que involucra el atributo de propagación de transacciones Propagación, que se define en la interfaz TransactionDefinition y es utilizado por PlatfromTransactionManager, la interfaz principal de la gestión de transacciones de Spring.
TransactionDefinition está definido por PlatfromTransactionManager y utilizado por Spring. PlatfromTransactionManager PlatfromTransactionManager es la interfaz principal de la gestión de transacciones de Spring
TransactionDefinition
public interface TransactionDefinition {
int getPropagationBehavior()
int getIsolationLevel; ( );
int getTimeout();
booleano isReadOnly()
}
getTimeout ( ) método que devuelve el número de segundos que debe completarse la transacción
isReadOnly() Si la transacción es de solo lectura El administrador de transacciones puede optimizar en función de este valor de retorno para garantizar que la transacción sea de solo lectura
getIsolationLevel() El método devuelve el nivel de aislamiento de la transacción
La interfaz TransactionDefinition define cinco niveles de aislamiento de transacción diferentes ISOLATION_DEFAULT Este es el nivel en el que una transacción está aislada de otras transacciones. . El nivel de aislamiento predeterminado de PlatfromTransactionManager utiliza el nivel de aislamiento de transacciones predeterminado de la base de datos. Los otros cuatro corresponden a los niveles de aislamiento de JDBC. Este es el nivel más bajo de aislamiento de transacciones y permite que diferentes transacciones vean datos no confirmados en esta transacción. Este nivel de aislamiento creará lecturas sucias, lecturas no repetibles y lecturas fantasma
Algunas opciones se proporcionan en la interfaz TransactionDefinition***
PROPAGATION_REQUIRED admite la transacción actual si no hay. transacción actual, se creará una nueva transacción. SUPPORTS Admite la transacción actual, si no hay una transacción actual, se ejecuta de manera no transaccional
PROPAGATION_MANDATORY Admite la transacción actual, si no hay una transacción actual, genera una excepción
PROPAGATION_REQUIRES_NEW Crea una nueva transacción si hay una transacción actual, luego suspende la transacción actual
PROPAGATION_MANDATORY admite la transacción actual y suspende la transacción actual si hay una transacción actual
PROPAGATION_NOT_SUPPORTED realiza la operación de manera no transaccional y suspende la transacción actual (si existe)
PROPAGATION_NEVER realiza la operación de manera no transaccional y lanza una excepción si existe
PROPAGATION_NESTED admite la transacción actual.
Confirmar o revertir el nuevo punto de guardado de la transacción sincronizado con la transacción actual
Ahora, ilustraremos esto mediante un ejemplo. La aplicación de las propiedades de propagación anteriores primero declara dos beans ServiceA y ServiceB, donde se hace referencia a ServiceB p>
ServicioA {
void métodoA () {
métodoB()
}
}
ServicioB {
void métodoB() {
}
}
A continuación, los analizaremos uno por uno .
PROPAGATION_REQUIRED
REQUIRED
Agregue la transacción que se está ejecutando actualmente y que no esté en otra transacción, y luego inicie una nueva transacción. Por ejemplo, si el nivel de transacción de thodB se define como PROPAGATION_REQUIRED, debido a que thodA ya inició una transacción cuando thodA se ejecuta, thodB ya se encuentra ejecutándose en la transacción de thodA y, por lo tanto, no inicia otra transacción. Si thodA se ejecuta y descubre que no está en una transacción, se asigna a sí mismo una transacción para que cualquier excepción en thodA o thodB se revierta. Aunque la transacción de thodB se haya confirmado, thodA debe revertirse en el siguiente error, y Lo mismo ocurre con thodB.
PROPAGATION_REQUIRED p>
PROPAGATION_SUPPORTS
Si actualmente está en una transacción, se ejecuta como una transacción; si no está actualmente en una transacción, se ejecuta; como ejecución no transaccional
PROPAGATION_MANDATORY
Debe estar dentro de una transacción, lo que significa que solo puede ser invocada por una transacción principal. De lo contrario, generará una excepción
PROPAGATION_REQUIRES_NEW
Por ejemplo, si configuramos thodA en PROPAGATION_REQUIRED y thodB en PROPAGATION_REQUIRES_NEW, cuando se ejecute thodB, thodA estará en PROPAGATION_REQUIRED_NEW, thodB estará en PROPAGATION_REQUIRES_NEW, thodB estará en PROPAGATION_NEW_NEW. La diferencia entre una transacción PROPAGATION_REQUIRED y una transacción PROPAGATION_REQUIRES_NEW es el nivel de reversión, porque si thodB es una transacción nueva, entonces hay dos transacciones diferentes. Si thodA ya se ha comprometido, entonces thodA no puede revertir, pero thodB no. Si thodB no logra revertir, la transacción thodA aún puede confirmarse si thodB genera una excepción y thodA detecta la excepción.
PROPAGATION_NOT_SUPPORTED
Actualmente, ninguna transacción admite este nivel.
Si PROPAGATION_REQUIRED y el nivel de transacción de thodB es PROPAGATION_NOT_SUPPORTED, cuando se ejecute thodB, la transacción de thodA se suspenderá y la transacción de thodA se reanudará en un estado sin transacción cuando finalice thodB
PROPAGATION_NEVER
Esta transacción no se puede ejecutar dentro de una transacción.
No se puede ejecutar en una transacción. Supongamos que el nivel de transacción de thodA es PROPAGATION_REQUIRED y el nivel de transacción de thodB es PROPAGATION_NEVER, entonces thodB generará una excepción
PROPAGATION_NESTED
Comprender La clave para Nested es el punto de guardado, que es lo mismo que PROPAGATION_NESTED
La clave para entender Nested es el punto de guardado, que es lo mismo que PROPAGATION_NEVER. La diferencia entre PROPAGATION_REQUIRES_NEW y PROPAGATION_REQUIRES_NEW es que PROPAGATION_REQUIRES_NEW inicia una transacción independiente de la transacción principal, mientras que la transacción anidada depende de la transacción principal. También se confirma cuando la transacción principal se confirma, lo que significa que si la transacción principal se revierte, también debe. retroceder. Es decir, si la transacción principal se revierte, también se revertirá. La ventaja de la transacción anidada es que tiene un punto de guardado
ServicioA {
void métodoA() {
p>
prueba {
thodB();
} captura (Excepción e) {
thodC() {
thodC() {
thodC() { {
thodC()
}
}
} lishixinzhi/Article/program/Java/ky/201311/28910