Cómo utilizar la transacción de primavera en multithread


Tengo un método como a continuación:

ClassA.java
@Transactional
public void methodA(){        
    ExecutorService executorService = Executors.newFixedThreadPool(4);
    executorService.execute(new Runnable() {
        public void run() {
            classB.methodB();
        }
});
}
ClassB.java
@Transactional
public void methodB(){
    updateDB();
}

¿Puede el methodB funcionar bien? Según mi entendimiento, methodB adjuntará la transacción de methodA, ¿qué pasa si methodA sale antes de methodB? Supongo que sólo methodA puede ser comprometido por la transacción. Pero methodB no confirmará porque la transacción se comprometió antes.

Puedo usar @Transactional(propagation = Propagation.REQUIRES_NEW) para methodB. Esto puede permitir que methodB tenga una nueva transacción. Pero según Spring doc, la transcación de methodA suspenderá cuando invoque methodB. Me siento muy confundido aquí.

¿Alguien puede ayudarme en este asunto? Gracias de antemano.

Author: Jacky, 2012-05-02

1 answers

No, methodB() no se ejecutará en la misma transacción que methodA(). Spring's @Transactional solo funciona en un solo hilo - crea una sesión cuando un hilo entra por primera vez en un método con @Transactional (o un método en una clase con @Transactional), y luego lo confirma cuando sale de ese método.

En su ejemplo, la transacción finalizará después de programar el trabajo en el grupo de subprocesos. methodB() tendrá su propia transacción.

 24
Author: jmruc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-02 06:47:50