我们有一个 Spring 交易回滚问题,回滚似乎不起作用。
在用@Transactional
注释的服务层方法中,我调用了三个不同的DAOImpl
类以插入3条记录。中间插入内容从第4个表进行获取以填充描述字段,但此获取失败。我希望第一个插入回滚,但是似乎没有发生。
一些点:
org.springframework.jdbc.datasource.DataSourceTransactionManager
中定义的MySQL datasource
和applicationContext.xml
。 Bean以Beans.xml
创建,并导入ApplicationContext.xml
@Transactional
层中没有DAO
批注<tx:annotation-driven transaction-manager="transactionManager"/>
中再次使用了applicationContext.xml
UPDATE :
代码段...
服务等级-这有点类似于我所拥有的....我在使用@Autowired和不使用@Autowired的情况下进行了测试。在服务类中调用事务启用方法。
公共(public)类CustomerService {
//@自动连线
CustomerOrderDAO customerOrderDAOImpl;
//@自动连线
CustomerItemDAO customerItemDAOImpl;
//@自动连线
CustomerPromotionDAO customerPromotionDAOImpl;
//@自动连线
PromotionDAO PromotionDAOImpl;
//其他变量
public CustomerOrder handleIncomingOrders(CustomerOrder customerOrder){
尝试 {
saveOrderDetails(customerOrder);
.....
返回customerOrder;
} catch(Exception e)//TO-DO捕获适当的异常
{
//发送错误响应
.......
返回customerOrder;
}
}
@交易
public void saveOrderDetails(CustomerOrder customerOrder)引发异常{
customerOrderDAOImpl.create(customerOrder);
....
同时(promotionsIterator.hasNext()){
customerPromotion.setPromotionName(promotionDAOImpl.getName(customerOrder.getPromotionId));
customerPromotionDAOImpl.create(customerPromotion);
}
......
同时(customerItemIterator.hasNext()){
customerItemDAOImpl.create(customerItem);
}
}
}
任何想法?
谢谢。
最佳答案
@Transactional
的默认行为是在对象周围添加了代理交易行为(示例中的CustomerService
)。从reference docs(向下滚动):
在您的示例中,对handlingIncomingOrders()
的外部调用通过代理并到达目标对象(CustomerService
的实例)。但是,对saveOrderDetails()
的后续调用是目标对象内部的常规方法调用,因此永远不会调用代理中的事务行为。但是,如果从另一个类调用了saveOrderDetails()
,您将发现事务行为将按预期工作。