2016-11-06 233 views
1

我介紹了一個問題「春季交易失敗回滾」。我有一個服務類,它調用2個DAO將數據插入到數據庫表中。春季交易失敗回滾

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

emTrcvHeaderDAO.create(VO)應rollack爲emTrcvLineDAO.create(lineVo)失敗並引發org.springframework.dao.DataIntegrityViolationException ,但實際上emTrcvHeaderDAO.create(VO)不會回退和VO數據仍然可以插入D B。爲什麼? – runboy2000

+0

saveEmTrcvHeader()是emTrcvHeaderService服務bean的一種方法。 – runboy2000

+0

哇...這是非常古老的配置,我真的希望這不是你正在使用它的新東西。沒有看到你的tx管理器配置和dao實現以及你正在使用哪個hibernate版本的解釋,任何答案都只是一個猜測。您也無法解釋哪個數據庫(以及您正在使用的表類型)。 –

回答

0

我覺得你必須提到回滾時,應該發生。 根據文檔 回滾規則的概念很重要:它們使您能夠指定哪些異常(和throwables)應導致自動回滾。您可以在配置中以聲明方式指定,而不是在Java代碼中。因此,儘管您仍然可以在TransactionStatus對象上調用setRollbackOnly()以回滾當前事務,但通常您可以指定MyApplicationException必須始終導致回滾的規則。

請了解更多詳情

+0

我已經聲明事務應該回滾,如果異常拋出「txProxyTemplate」bean定義。 emTrcvLineDAO.create(lineVo)必須拋出異常,因爲lineVo數據會丟失數據庫表的某些必填字段。但是,「emTrcvHeaderDAO.create(vo)」仍然可以將數據成功保存到數據庫,甚至emTrcvLineDAO.create(lineVo)也會拋出DataIntegrityViolationException。 – runboy2000