不同DAO实施之间的相关回滚

时间:2016-12-20 06:25:36

标签: spring hibernate spring-mvc rollback transactional

我目前正在开发一个spring mvc + hibernate应用程序。它有Service和DAO层。

我想知道的是有一种方法可以在不同的DAO实现之间实现依赖回滚

例如,我通过使用A的DAO实现在表A中添加了与模型A映射的条目/行。 然后我试图为表B做同样的事情。但是当尝试相同的表C时,会发生错误 然后我希望回滚表A和表B中所做的更改。

有没有办法实现这一点,请告诉我任何帮助,并提前感谢您:D

主持人的说明:我知道这个问题可能听起来很自以为是,但如果我在几天内没有找到任何令人满意的答案,我会自行关闭。

2 个答案:

答案 0 :(得分:2)

显然,您将从服务类中调用所有这些dao方法。使该服务方法/类事务性。使用@Transactional注释服务方法/类。

  1. 这将在方法执行开始时创建一个新的Hibernate会话。
  2. 将该会话用于dao层中的所有db事务。
  3. 最后提交/回滚所有这些数据库事务。
  4. 如果发生任何运行时异常,则在表C修改期间,将在表A和表A中完成回滚。 B,自动。

    参考这些

    http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html http://blog.jhades.org/how-does-spring-transactional-really-work/

答案 1 :(得分:1)

是的,你可以回滚所有的交易,请在下面的代码片段中找到你正在调用所有dto方法的serviceMethod,如果异常,所有交易都将回滚。

注意:您必须指定要回滚的异常。对于运行时异常事务将不会回滚。 spring DTO抛出DataAccessException,这是一个运行时异常并使用transactionManager的正确实现。

@Service
    public class ServiceClass{

        @Autowire
        private Repository repo;

        @Transactional(rollbackFor={XYZ.class}, propagation=Propagation.REQUIRES_NEW, isolation=Isolation.SERIALIZABLE)
        public void serviceMethod(){
            repo.insertIntoA();
            repo.insertIntoB();
            repo.insertIntoC();
        }
    }

XML配置:

<bean id="transactionManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <!--  Thread safe, singletone , Hibernate 3 only -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource"  ref="dataSource"/>
        <property name="mappingResources">
            <array>
                <value>com/domain/Customer-hbm.xml</value>
            </array>
        </property>
        <property name="hibernateProperties">
            <props>
                    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
                    <prop key="hibernate.show_Sql">true</prop>
                    <prop key="hibernate.format_sql">true</prop>        
            </props>
        </property>
    </bean>