Lo siento si esto se ha discutido antes, pero simplemente no pude encontrar la respuesta en todas las discusiones relacionadas sobre la anotación java @Transactional spring.
¿Qué sucede si llamamos a un método en otra instancia que no tiene una anotación @Transactional desde un método que tiene una anotación @Transactional? ¿Se suspenderá la transacción del método anotado @Transactaional? o se propagaría?
Encontré muchas discusiones sobre si la llamada al segundo método es de la misma instancia, pero no si el segundo método no transaccional está en otra instancia. ¡Gracias por tu ayuda!
Como en el ejemplo a continuación, ¿qué sucedería si se llama a methoda() en la clase B desde methoda() en la clase A? ¿Se propagaría la transacción de methoda o methodb no sería transaccional?
Código de ejemplo a continuación:
public class A { @Autowired B b; @Transactional public void methoda(){ b.methodb(); } } @Component public class B { //this method is non transactional and is called from method A in class A public void methodb() { //do some db updates } }Si no hay anotaciones @Transactional en B para indicar lo contrario, entonces el método b usa la transacción establecida en la llamada a A.methoda. Esto es normal para Spring, tenemos componentes marcados como transaccionales que llaman a DAO que participan en la transacción actual sin estar marcados como transaccionales.
Si realmente desea suspender la transacción actual, puede agregar esta anotación al método b:
@Transactional(propagation = Propagation.NOT_SUPPORTED)Hay una advertencia sobre la suspensión de transacciones en el documento de Spring API:
NOTA: La suspensión real de transacciones no funcionará de manera inmediata en todos los administradores de transacciones. Esto en particular se aplica a JtaTransactionManager, que requiere que javax.transaction.TransactionManager esté disponible para él (que es específico del servidor en Java EE estándar).