当前位置: 首页 > 知识库问答 >
问题:

Spring事务失败回滚

冯旭
2023-03-14

我列出了一个问题“Spring事务失败回滚”。我有一个服务类,它调用2 DAO将数据插入到数据库表中。

 public void saveEmTrcvHeader(List<EmTrcvHeaderVOImpl> voList,  List<ResponseItem> responseItemList) {

        for (EmTrcvHeaderVOImpl vo : voList) {
            emTrcvHeaderDAO.create(vo);
            List<EmTrcvLineVOImpl> lineList = vo.getLineList();
            for (int i = 0; i < lineList.size(); i++) {
                EmTrcvLineVOImpl lineVo = lineList.get(i);
                lineVo.setEmTrcvHeaderId(vo.getEmTrcvHeaderId());
                lineVo.setProjId(null);
                emTrcvLineDAO.create(lineVo);

            }    

        }       

}

我的事务配置:

<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
        <ref bean="transactionManager" />
    </property>
    <property name="proxyTargetClass">
        <value>true</value> 
    </property>
    <property name="transactionAttributes">
        <props>             
            <prop key="save*">PROPAGATION_REQUIRED,-java.lang.Exception,-org.springframework.dao.DataAccessException</prop>     
            <prop key="*">PROPAGATION_REQUIRED,-java.lang.Exception,-org.springframework.dao.DataAccessException</prop>
        </props>
    </property>
</bean>

我的服务和dao定义如下:

<bean name="emTrcvHeaderService" parent="txProxyTemplate">
    <property name="target">
      <bean class="com.emtrcv.service.EmTrcvHeaderService">
        <property name="emTrcvHeaderDAO">
          <ref bean="emTrcvHeaderDAO"/>
        </property>
         <property name="emTrcvPubSelectIdsDAO">
          <ref bean="emTrcvPubSelectIdsDAO"/>
        </property>
        <property name="emTrcvLineDAO">
          <ref bean="emTrcvLineDAO"/>
        </property>
      </bean>
    </property>
  </bean>
  <bean name="emTrcvHeaderDAO" class="com.emtrcv.dao.EmTrcvHeaderDAOImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
  </bean>
  <bean name="emTrcvPubSelectIdsDAO" class="com.emtrcv.dao.EmTrcvPubSelectIdsDAOImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
  </bean>
   <bean name="emTrcvLineDAO" class="com.emtrcv.dao.EmTrcvLineDAOImpl">
    <property name="sessionFactory" ref="sessionFactory"/>
  </bean>

共有1个答案

云鸿祯
2023-03-14

我想你必须提到回滚应该在什么时候发生。根据doc,回滚规则的概念很重要:它们使您能够指定哪些异常(和抛物)应该导致自动回滚。您可以在配置中以声明的方式指定它,而不是在Java代码中指定它。因此,尽管您仍然可以调用TransactionStatus对象上的setRollbackOnly()来回滚当前事务,但通常您可以指定一个规则,即MyApplicationException必须始终导致回滚。

有关详细信息,请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html

 类似资料:
  • 本文向大家介绍java事务回滚失败问题分析,包括了java事务回滚失败问题分析的使用技巧和注意事项,需要的朋友参考一下 Spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因。 一切还是要从Java的检查型异常和非检查型异常说起。 那么什么是检查型异常什么又是非检查型异常呢? 最简单的判断点有两个: 1.继

  • 让我们想象一下这种情况,然后我们在微服务中使用SAGA方法管理分布式事务。 失败的场景: < li >服务A成功完成任务,并将消息发送给服务B < li >服务B成功完成任务,并将消息发送到服务C < li >服务C失败,并向服务B发送消息以撤消交易。 < li >服务B尝试撤消交易但失败。 因此,我们有不一致的数据,这是不可接受的。问题是,SAGA模式下事务回滚失败的情况如何处理?

  • 问题是,即使在为Exception.class声明回滚之后,事务仍然没有回滚。 1.我的数据源

  • 您能否帮助解决Resin+Oracle上XA事务的问题: 我们有WebApp,它必须执行涉及Oracle11.2.0.1和EHCache2.7的业务事务。(实际上可能有各种组合--两个不同的Oracle数据源(不同的模式),带有/不带有Ehcache,等等)。这就是从普通JDBC使用切换到JTA事务划分的原因。 > 在外部事务中使用Ehcache访问,在内部事务中只使用DB访问,即使在内部事务中使

  • 更新: 我发现我将类A注入到扩展外部类的类C中,该类不受spring管理,如下所示: 这应该是交易失败的主要原因。 另一个问题:有没有办法让spring管理类A的事务,该类已经注入到非spring处理的anothor类中? 我正在用Spring Boot和Mybatis建立一个项目。 我有一个问题,其中一个服务类无法创建事务连接,也不会执行回滚。 我发现,如果我去掉B类中A类的注入,就像这样: 类

  • 我正在使用Spring引导 1.3 开发一个 spring 应用程序 我有一个类似这样的MVC请求处理程序: 这是它的集成测试 删除了一些位以留出空间,但请注意顶部的@Transactional注释 它运行和通过没有线: 但是当添加它时,它给出了这个讨厌的异常,这是一个bean验证异常,没有任何数据插入操作(Spring mvc已经处理的验证错误和BindingResault中的结果) 当我在类级