我正在使用Spring3,Java 6和Oracle。我有一个服务类,实现一个接口,通过接口调用DAO。
如果第二次插入失败,我希望第一次插入回滚。对于第二个插入,我只是抛出一个RuntimeException来测试第一个的回滚。它永远不会回滚。我在数据库中留了一行。
我错过了一步吗?我确保使用接口,因为我已经读过Spring使用AOP代理来处理需要和接口的事务。
服务:
@Service
public class APIServiceImpl implements APIService {
@Override
@Transactional
public void testPromotion(int duration, String productId, String offerId) {
Integer promotionId = apidao.insertPromotion("3", productId);
Integer test = apidao.insertTest(offerId, productId); //runtime exception
}
}
DAO:
@Component
public class ApiDaoImpl implements ApiDao {
public Integer insertPromotion(final int offerId, final String promoCode) {
final String sqlText = "INSERT INTO promotion ("
+ " promotion_id, "
+ " offer_id, "
+ " promotion_code, ") "
+ " VALUES ("
+ " seq_partner_promotion.nextval, "
+ " ?, "
+ " ?, ") ";
return myJdbcTemplate.update(sqlText, offerId, promoCode);
}
public Integer insertTest(final int offerId, final String promoCode) {
throw new RuntimeException();
}
应用背景:
<bean name="myJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg ref="myDataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="myDataSource"/>
</bean>
答案 0 :(得分:0)
如何用@Repository(而不是@Component)和@Transactional标记ApiDaoImpl(以确保它参与与调用者相同的事务)?