tenemos:nueva transacción en el frijol de primavera
@Transactional(propagation = Propagation.REQUIRED)
public class MyClass implementes MyInterface { ...
MyInterface tiene un único método: go()
.
Cuando se ejecuta go() iniciamos una nueva transacción que confirma/revierte cuando se completa el método, esto está bien.
Digamos que en go() llamamos a un método privado en MyClass que tiene @Transactional(propagation = Propagation.REQUIRES_NEW
. Parece que Spring "ignora" la anotación REQUIRES_NEW y no inicia una nueva transacción. Creo que esto se debe a que Spring AOP funciona en el nivel de interfaz (MyInterface) y no intercepta ninguna llamada a los métodos de MyClass. ¿Es esto correcto?
¿Hay alguna manera de comenzar una nueva transacción dentro de la transacción go()? ¿Es la única forma de llamar al otro Bean administrado por resorte que tiene transacciones configuradas como REQUERES_NEW?
actualización: Agregando que cuando los clientes ejecutan go()
lo hacen a través de una referencia a la interfaz, no a la clase:
@Autowired
MyInterface impl;
impl.go();
Pero incluso si '@ Transactional' está en un método público de MyClass, todavía parece que Spring no lo recogerá ** a menos que ** el método esté definido en la interfaz, ¿correcto? –
Para agregar, esto se debe a que el cliente que está ejecutando el método go() en cuestión tiene una referencia a la interfaz, no a la clase. –
@Marcus: más o menos. Si 'MyClass' implementa una interfaz, Spring solo usará esa interfaz para generar el proxy transaccional e ignorará incluso los métodos públicos que no sean de interfaz. Sin embargo, si 'MyClass' no implementa ninguna interfaz, entonces se usarán todos los métodos públicos. – skaffman