Spring事务失败回滚

时间:2016-11-06 14:07:42

标签: spring

我遇到了一个问题“Spring transaction fail rollback”。我有一个服务类,它调用2 DAO将数据插入到DB表中。

emTrcvLineDAO.create(lineVo)无法插入到表中,因为lineVo缺少一些必填字段,但emTrcvHeaderDAO.create(vo)无法回滚,数据仍然成功插入到数据库中。我想知道为什么它不回滚,因为两个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>

2 个答案:

答案 0 :(得分:0)

我认为您必须提及何时应该进行回滚。 按照文档, 回滚规则的概念很重要:它们使您能够指定哪些异常(和throwable)应该导致自动回滚。您可以在配置中以声明方式指定它,而不是在Java代码中。因此,尽管您仍然可以在TransactionStatus对象上调用setRollbackOnly()来回滚当前事务,但大多数情况下您可以指定MyApplicationException必须始终导致回滚的规则。

请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html了解详情

答案 1 :(得分:0)

最后我找到了根本原因。有两个重复的Spring配置文件都在项目中定义了事务管理规则,它使spring tranasction管理不起作用。删除其中一个后,它就可以了。