Pregunta

Los documentos de primavera hacen unFantástico trabajo de describir las propiedades de propagación transaccional.

Sin embargo, me preguntaba si hay algunos ejemplos bien conocidos y del mundo real disponibles que describen cada una de estas propiedades más a fondo en los términos de Layman?

¿Fue útil?

Solución

propagation_required

class Service {
    @Transactional(propagation=Propagation.REQUIRED)
    public void doSomething() {
        // access a database using a DAO
    }
}

Cuando se llama dosalgo () iniciará una nueva transacción si la persona que llama ya no ha iniciado una transacción .

Si la persona que llama de este método ya ha iniciado una transacción, la transacción de las llamadas se usa y no se crea una transacción nueva (es decir, hay una transacción en juego).

Si se tira una excepción dentro de Dosomething (), se lanzará hacia atrás, lo que significa que la persona que llama también verá la transacción enrollada hacia atrás.

Cuando DoSomething () devuelve la transacción no se habrá comprometido aún. Es la persona que llama que cometerá la transacción (o posiblemente enrollada).

propagation_requires_new

class Service {
    @Transactional(propagation=Propagation.REQUIRES_NEW)
    public void doSomething() {
        // access a database using a DAO
    }
}

Cuando se llama Dosomething (), siempre será Iniciar una nueva transacción.

Si la persona que llama de este método ya ha iniciado una transacción (TxNouter), entonces la transacción de las llamadas se encuentra suspendida y se crea una nueva transacción (TXNinner) (es decir, hay dos transacciones en juego).

Si se tira una excepción dentro de la dosalgo (), entonces TXNinner se retrasará, pero la transacción "suspendida" de la persona que llama (TxNouter) no se ve afectada.

Cuando DoSomething () vuelve sin una excepción, cometerá la transacción (Txninner). La transacción de la persona que llama (TxNouter) se reanudará y desconocerá que se comprometió otra transacción. Luego, la persona que llama puede comprometerse o retroceder a TxNouter a medida que se ajusta.

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 cometidas independientes.

propagación_teded

class Service {
    @Transactional(propagation=Propagation.NESTED)
    public void doSomething() {
        // access a database using a DAO
    }
}

anidado solo se puede usar si su controlador JDBC y / o base de datos admite JDBC SavePoints

Cuando se llama dosalgo () iniciará una nueva transacción si la persona que llama ya no ha iniciado una transacción .

Si la persona que llama de este método ya ha iniciado una transacción, la transacción de las llamadas se usa y no se crea una transacción nueva (es decir, hay una transacción en juego). Sin embargo, un "SavePoint" está marcado en la transacción cuando se ingresa dosalgo ().

Si se tira una excepción dentro de dosalgo (), la transacción se puede enrollar parcialmente la transacción al "SavePoint". La persona que llama continuará con la transacción.

Cuando DoSomething () vuelve sin una excepción, es la persona que llama cometemos toda la transacción (o rodar hacia atrás).

El punto importante a tener en cuenta es que la base de datos considera solo una transacción y solo hay una confirmación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top