不同 DAO 实现之间的依赖回滚

Dependent rollback among different DAO implementation

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

我想知道的是有没有办法实现不同DAO实现之间的依赖回滚

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

有没有办法做到这一点,如果有任何帮助,请告诉我,在此先感谢您:D

版主注意事项:我知道这个问题听起来有点自以为是,但请放心,如果几天后我没有找到满意的答案,我会自己关闭它。

显然,您将从您的服务中调用所有这些 dao 方法 class。使该服务 method/class 交易。用 @Transactional.

注释服务 method/class
  1. 这将在方法执行开始时创建一个新的 Hibernate 会话。
  2. 将为您在 dao 层中的所有数据库事务使用该会话。
  3. Commits/Rollback 所有这些数据库事务都在最后。

如果在您的 Table C 修改期间发生任何运行时异常,回滚将在 Tables 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/

是的,您可以回滚所有事务,请在下面的代码片段中找到,您正在从 serviceMethod 调用所有 dto 方法,如果出现异常,所有事务都将被回滚。

注意:您必须指定要回滚的异常。对于运行时异常事务不会回滚。 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>