2016-11-06 12 views
1

"Spring transaction fail rollback"という問題が発生します。 DBテーブルにデータを挿入するために2 DAOを呼び出すサービスクラスがあります。Springトランザクション失敗ロールバック

emTrcvLineDAO.create(lineVo)いくつかの必須フィールドが欠落していますが、emTrcvHeaderDAO.create(vo)ロールバックが失敗し、データがDBに正常に挿入されているため、テーブルに挿入できません。私は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> 
+0

emTrcvHeaderDAO.create(VO)emTrcvLineDAO.create(lineVo)としてrollackする必要があります失敗し、org.springframework.dao.DataIntegrityViolationException 投げるが、実際emTrcvHeaderDAO.create(VO)ロールバックしないとVOデータがまだ中に挿入することDB。どうして? – runboy2000

+0

saveEmTrcvHeader()は、emTrcvHeaderServiceサービスBeanのメソッドの1つです。 – runboy2000

+0

うわー...それはかなり古い設定ですが、私は本当にあなたがこれを使っている何か新しいものではないことを願っています。あなたのtxマネージャの設定とdaoの実装とあなたが使用している休止状態のバージョンについての説明を見ることなく、答えは単なる推測に過ぎません。また、どのデータベース(およびオプションで使用しているテーブルタイプ)についても説明していません。 –

答えて

0

私はあなたがロールバックを行うべき時に言及することがあると思います。 ドックごとに ロールバック規則の概念は重要です。ロールバック規則を使用すると、自動ロールバックを発生させる例外(およびスロー可)を指定できます。 Javaコードではなく、設定でこれを宣言的に指定します。したがって、TransactionStatusオブジェクトでsetRollbackOnly()を呼び出して現在のトランザクションをロールバックすることはできますが、ほとんどの場合、MyApplicationExceptionが常にロールバックする必要があるルールを指定できます。

詳細

+0

"txProxyTemplate" Bean定義で例外がスローされた場合、トランザクションはロールバックする必要があります。 lineVoデータがDBテーブルのいくつかの必須フィールドを逃すため、emTrcvLineDAO.create(lineVo)は例外をスローする必要があります。しかし、 "emTrcvHeaderDAO.create(vo)"は、emTrcvLineDAO.create(lineVo)でもDataIntegrityViolationExceptionがスローされても、DBにデータを正常に保存できます。 – runboy2000

0

最後に、私は、根本的な原因を発見したためhttp://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.htmlを参照してください。 2つの重複したSpring設定ファイルがあり、どちらもプロジェクト内のトランザクション管理ルールを定義しています。これにより、Springのトランザクション管理は機能しません。そのうちの1つを削除した後、動作します。

関連する問題