【问题标题】:Dependent rollback among different DAO implementation不同DAO实现之间的依赖回滚
【发布时间】:2016-12-20 06:25:35
【问题描述】:

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

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

例如,我使用 A 的 DAO 实现在与模型 A 映射的表 A 中添加了一个条目/行。 然后我正在尝试对表 B 执行相同操作。但是,在尝试对表 C 执行相同操作时,会发生错误 那么我希望回滚表 A 和表 B 中所做的更改。

有没有办法实现这一点,让我知道任何帮助表示赞赏并提前感谢您:D

版主注意事项:我知道这个问题可能听起来很自以为是,但请放心,如果我在几天内找不到任何满意的答案,我会自己关闭它。

【问题讨论】:

  • 是的,这就是交易的全部意义所在。只要所有 DAO 交互都在单个事务中进行,所有内容都会回滚。
  • 这可以理解,但我希望实现的是在不同的DAO之间有一个依赖的交易链。如果其中一个有错误,那么所有先前的事务[可能已经提交]也将回滚。这些交易不会在一个带有@transaction 注释的文件中。
  • committed 已提交。您不能回滚已经提交的内容。如果您希望能够回滚更改,请不要提交它。

标签: spring hibernate spring-mvc rollback transactional


【解决方案1】:

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

  1. 这将在方法执行开始时创建一个新的 Hibernate 会话。
  2. 将为您在 dao 层中的所有 db 事务使用该会话。
  3. 最后提交/回滚所有这些数据库事务。

如果发生任何运行时异常,在您修改表 C 的过程中,将自动在表 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/

【讨论】:

    【解决方案2】:

    是的,您可以回滚所有事务,请在sn-p下面找到,您正在从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>
    

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 2012-09-15
      • 2021-11-07
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2016-06-18
      • 2013-05-22
      相关资源
      最近更新 更多