Spring事务失败回滚

Spring事务失败回滚,spring,Spring,我遇到了一个问题“Spring事务失败回滚”。我有一个服务类,它调用2 DAO将数据插入DB表 emTrcvLineDAO.create(lineVo)无法插入到表中,因为lineVo缺少一些必填字段,但emTrcvHeaderDAO.create(vo)回滚失败,数据仍然成功插入到DB中。我想知道为什么它不回滚,因为两个DAO在同一事务中 有人知道这个吗?提前谢谢 public void saveEmTrcvHeader(List<EmTrcvHeaderVOImpl> voLi

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

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

            }    

        }       

}
public void saveEmTrcvHeader(List voList,List responseItemList){
用于(EmTrcvHeaderVOImpl vo:voList){
emTrcvHeaderDAO.create(vo);
List lineList=vo.getLineList();
对于(int i=0;i
我的事务配置:

<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>

真的
需要传播\u,-java.lang.Exception,-org.springframework.dao.DataAccessException
需要传播\u,-java.lang.Exception,-org.springframework.dao.DataAccessException
我的服务和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>

我想您必须提及应该在何时进行回滚。 根据文件, 回滚规则的概念很重要:它们使您能够指定哪些异常(和可丢弃项)应该导致自动回滚。您可以在配置中,而不是在Java代码中,以声明的方式指定它。因此,尽管仍然可以在TransactionStatus对象上调用setRollbackOnly()回滚当前事务,但通常可以指定MyApplicationException必须始终导致回滚的规则


请参阅以了解更多详细信息

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


请参阅以了解更多详细信息

我终于找到了根本原因。项目中有两个重复的Spring配置文件,都定义了事务管理规则,这使得Spring事务管理无法工作。在移除其中一个之后,它就起作用了。

最后我找到了根本原因。项目中有两个重复的Spring配置文件,都定义了事务管理规则,这使得Spring事务管理无法工作。删除其中一个后,它会工作。

emTrcvHeaderDAO.create(vo)应该回滚为emTrcvLineDAO.create(lineVo)失败并抛出org.springframework.dao.DataIntegrityViolationException,但实际上emTrcvHeaderDAO.create(vo)不会回滚,vo数据仍然插入数据库。为什么?saveEmTrcvHeader()是emTrcvHeaderService bean的方法之一。。。这是相当旧的配置,我真的希望它不是新的东西,你正在使用这个。没有看到您的tx管理器配置和dao实现,也没有解释您使用的是哪个hibernate版本,任何答案都只是猜测。您也无法解释正在使用的数据库(以及可选的表类型)。emTrcvHeaderDAO.create(vo)应作为emTrcvLineDAO.create(lineVo)回滚。create(lineVo)失败并抛出org.springframework.dao.DataIntegrityViolationException,但实际上emTrcvHeaderDAO.create(vo)不会回滚,vo数据仍然插入数据库。为什么?saveEmTrcvHeader()是emTrcvHeaderService bean的方法之一。。。这是相当旧的配置,我真的希望它不是新的东西,你正在使用这个。没有看到您的tx管理器配置和dao实现,也没有解释您使用的是哪个hibernate版本,任何答案都只是猜测。您也无法解释正在使用的数据库(以及可选的表类型)。我已经声明,如果在“txProxyTemplate”bean定义中抛出异常,则应该回滚事务。emTrcvLineDAO.create(lineVo)必须抛出异常,因为lineVo数据缺少DB表的一些必填字段。然而,“emTrcvHeaderDAO.create(vo)”仍然可以成功地将数据保存到数据库中,即使emTrcvLineDAO.create(lineVo)抛出DataIntegrityViolationException。我已经声明,如果在“txProxyTemplate”bean定义中抛出异常,事务应该回滚。emTrcvLineDAO.create(lineVo)必须抛出异常,因为lineVo数据缺少DB表的一些必填字段。但是,“emTrcvHeaderDAO.create(vo)”仍然可以成功地将数据保存到DB中,即使emTrcvLineDAO.create(lineVo)抛出DataIntegrityViolationException。