"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>
emTrcvHeaderDAO.create(VO)emTrcvLineDAO.create(lineVo)としてrollackする必要があります失敗し、org.springframework.dao.DataIntegrityViolationException 投げるが、実際emTrcvHeaderDAO.create(VO)ロールバックしないとVOデータがまだ中に挿入することDB。どうして? – runboy2000
saveEmTrcvHeader()は、emTrcvHeaderServiceサービスBeanのメソッドの1つです。 – runboy2000
うわー...それはかなり古い設定ですが、私は本当にあなたがこれを使っている何か新しいものではないことを願っています。あなたのtxマネージャの設定とdaoの実装とあなたが使用している休止状態のバージョンについての説明を見ることなく、答えは単なる推測に過ぎません。また、どのデータベース(およびオプションで使用しているテーブルタイプ)についても説明していません。 –