style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

@Transactional spring framework

Hola soy nuevo en Spring y tengo una duda acerca de @Transactional, tengo un método que llama a dos métodos anotados con @Transactional cada uno de ellos hace un insert en una base de dados diferente pero cuando ocurre un error no hace rollback en ambas bases de datos.

Este es el método:

@Transactional(readOnly=false)
public ResponseEntity<ResultVo<String>> modificaFechasVacaciones(@RequestBody RequestVacacionesVO request,HttpServletRequest http) throws ParseException{

                       // base de datos 1
                        this.vacacionesBO.modificaSolicitudes(request, usuarioFormat,diasSolicitados, diasExcedentes);
                       
                       // base de datos 2
                        this.vacacionesBO.updateDiasSolicitados(request, diasSolicitados);

                        // base de datos 3
                        this.vacacionesBO.updateDiasDisponiblesRechazo(request, diasDisponibles);

               
        }

Esta es la configuración de los txManager para las dos bases de datos:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
                xmlns:context="http://www.springframework.org/schema/context"
                xmlns:tx="http://www.springframework.org/schema/tx"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
                xmlns:aop="http://www.springframework.org/schema/aop"
                xmlns:mvc="http://www.springframework.org/schema/mvc"
                xsi:schemaLocation="
                        <a href="
http://www.springframework.org/schema/beans" title="http://www.springframework.org/schema/beans">http://www.springframework.org/schema/beans</a> <a href="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
" title="http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
">http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
</a>                    <a href="
http://www.springframework.org/schema/context" title="http://www.springframework.org/schema/context">http://www.springframework.org/schema/context</a> <a href="http://www.springframework.org/schema/context/spring-context-3.0.xsd
" title="http://www.springframework.org/schema/context/spring-context-3.0.xsd
">http://www.springframework.org/schema/context/spring-context-3.0.xsd
</a>                    <a href="
http://www.springframework.org/schema/tx" title="http://www.springframework.org/schema/tx">http://www.springframework.org/schema/tx</a> <a href="http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
" title="http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
">http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
</a>                    <a href="
http://www.directwebremoting.org/schema/spring-dwr" title="http://www.directwebremoting.org/schema/spring-dwr">http://www.directwebremoting.org/schema/spring-dwr</a> <a href="http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd
" title="http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd
">http://www.directwebremoting.org/schema/spring-dwr-3.0.xsd
</a>                    <a href="
http://www.springframework.org/schema/aop" title="http://www.springframework.org/schema/aop">http://www.springframework.org/schema/aop</a> <a href="http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
" title="http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
</a>                    <a href="
http://www.springframework.org/schema/mvc" title="http://www.springframework.org/schema/mvc">http://www.springframework.org/schema/mvc</a> <a href="http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
" title="http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
">http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
</a>                    "
>

         
          <!-- Configuracion de transacciones para hibernate con spring     -->
          <tx:annotation-driven transaction-manager="txManager" />
          <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
                        <property name="sessionFactory" ref="hibernateSessionFactory" />
          </bean>
         
          <tx:annotation-driven transaction-manager="txManagerParametros" />
          <bean id="txManagerParametros"  class="org.springframework.orm.hibernate4.HibernateTransactionManager">
                        <property name="sessionFactory" ref="parametrosSessionFactory" />
          </bean>
</beans>

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Transacción distribuida

Lo que tienes es una transacción distribuida y para ello necesitas un transaction manager que considere eso. Con JTA podría funcionar, pero así como lo tienes, si falla la segunda transacción ya no se puede dar rollback a la primera porque ya se cerró, porque cada transaction manager solamente se encarga de su datasource.

Desconozco si existe configuración adicional para que las transacciones que se realizan son parte de una transacción distribuida y que no se haga commit a ninguna hasta que todo se haya realizado y al final se hagan todos los commits (aunque aún así podría fallar algo).

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">