java - requires_new - spring transaction propagation
Ejemplos de propagación de primavera en términos sencillos (1)
Los documentos de Spring hacen un trabajo fantástico al describir las propiedades de propagación transaccional.
Sin embargo, me preguntaba si hay ejemplos conocidos y reales del mundo real que describan cada una de estas propiedades de manera más completa en términos sencillos.
PROPAGATION_REQUIRED
class Service {
@Transactional(propagation=Propagation.REQUIRED)
public void doSomething() {
// access a database using a DAO
}
}
Cuando se llama a doSomething () se iniciará una nueva transacción si la persona que llama no ha iniciado una transacción .
Si la persona que llama a este método ya ha iniciado una transacción, se utiliza la transacción de las personas que llaman y no se crea una nueva transacción (es decir, hay una transacción en juego).
Si se lanza una excepción dentro de doSomething (), se retrotraerá, lo que significa que la persona que llama también verá la transacción retrotraída.
Cuando doSomething () devuelva la transacción aún no se habrá comprometido. Es la persona que llama la que confirmará la transacción (o posiblemente se retrotraerá).
PROPAGATION_REQUIRES_NEW
class Service {
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void doSomething() {
// access a database using a DAO
}
}
Cuando se llama a doSomething (), siempre se iniciará una nueva transacción.
Si el llamante de este método ya ha iniciado una transacción (TxnOuter), entonces la transacción de los llamantes se suspende y se crea una nueva transacción (TxnInner) (es decir, hay dos transacciones en juego).
Si se lanza una excepción dentro de doSomething (), TxnInner se retrotraerá, pero la transacción "suspendida" de la persona que llama (TxnOuter) no se verá afectada.
Cuando doSomething () devuelve sin una excepción, confirmará la transacción (TxnInner). La transacción de la persona que llama (TxnOuter) se reanudará y no se dará cuenta de que se haya cometido otra transacción. La persona que llama puede cometer o revertir TxnOuter como le parezca.
El punto importante a tener en cuenta es que la base de datos ve a TxnOuter y TxnInner como transacciones completamente independientes, y por lo tanto, dos confirmaciones independientes.
PROPAGATION_NESTED
class Service {
@Transactional(propagation=Propagation.NESTED)
public void doSomething() {
// access a database using a DAO
}
}
NESTED solo se puede usar si su controlador JDBC y / o su base de datos son compatibles con los puntos de salvamento JDBC
Cuando se llama a doSomething () se iniciará una nueva transacción si la persona que llama no ha iniciado una transacción .
Si la persona que llama a este método ya ha iniciado una transacción, se utiliza la transacción de las personas que llaman y no se crea una nueva transacción (es decir, hay una transacción en juego). Sin embargo, se marca un "punto de salvaguarda" en la transacción cuando se ingresa doSomething ().
Si se lanza una excepción dentro de doSomething (), entonces la transacción se puede revertir parcialmente a la "posición de salvaguarda". La persona que llama continuará con la transacción.
Cuando doSomething () se devuelve sin excepción, es la persona que llama quien realizará la transacción completa (o la retrotracción).
El punto importante a tener en cuenta es que la base de datos solo ve una transacción y solo hay un compromiso.