2012-05-02 13 views
29

tengo un método de la siguiente manera:Cómo utilizar la transacción primavera en multihilo

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 entiendo, el método B adjuntará la transacción del método A, ¿y si el método A sale antes del método B? Supongo que solo el método A puede ser comprometido por la transacción. Pero el método B no confirmará porque la transacción se haya comprometido antes.

¿Puedo utilizar @Transactional (propagation = Propagation.REQUIRES_NEW) para methodB. Esto puede permitir que el método B tenga una nueva transacción. Pero según el documento de primavera, la transcaturación del método A se suspenderá cuando invoque el método B. Me siento muy confundido aquí.

¿Alguien me puede ayudar con este problema? Gracias por adelantado.

+0

¿qué es exactamente lo que quieres que haga? –

Respuesta

23

No, methodB() no se ejecutará en la misma transacción que methodA(). El @Transactional de Spring solo funciona en un único subproceso: crea una sesión cuando un subproceso entra por primera vez en un método con @Transactional (o un método en una clase con @Transactional), y luego lo confirma cuando abandona 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.

+0

¿Puede aconsejar cómo controlar si no son la misma transacción? Lo que encontré fue que la transacción no fue comprometida. – Jacky

+0

@Jacky ¿Cuál de las dos transacciones no compromete? – jmruc

+0

La transacción del método B no confirma. – Jacky

Cuestiones relacionadas