我们遇到了 Spring 事务回滚问题,回滚似乎不起作用。
在我的服务层方法中,注释为@Transactional
我叫三个不同的DAOImpl
类插入3条记录。
中间插入从第四个表中获取数据以填充描述字段,但这失败了。我预计第一个插入会回滚,但似乎没有发生。
几点:
- “Get”方法抛出运行时异常
- 我们正在使用
org.springframework.jdbc.datasource.DataSourceTransactionManager
and MySQL datasource
定义于applicationContext.xml
。 Bean 是在以下位置创建的Beans.xml
这是导入到ApplicationContext.xml
- No
@Transactional
中的注释DAO
layer
- 我们已经用过
<tx:annotation-driven transaction-manager="transactionManager"/>
再次在applicationContext.xml
- 我们使用的是Spring 3.1
UPDATE:
代码片段....
服务类-这与我所拥有的类似......我在使用和不使用@Autowired 的情况下进行了测试。事务启用方法在服务类中调用。
public class CustomerService {
//@Autowired
CustomerOrderDAO customerOrderDAOImpl;
//@Autowired
CustomerItemDAO customerItemDAOImpl;
//@Autowired
CustomerPromotionDAO customerPromotionDAOImpl;
//@Autowired
PromotionDAO promotionDAOImpl;
//other variables
public CustomerOrder handleIncomingOrders(CustomerOrder customerOrder) {
try {
saveOrderDetails(customerOrder);
.....
return customerOrder;
} catch (Exception e) //TO-DO catch proper exception
{
//Send error response
.......
return customerOrder;
}
}
@Transactional
public void saveOrderDetails(CustomerOrder customerOrder) throws Exception {
customerOrderDAOImpl.create(customerOrder);
....
while (promotionsIterator.hasNext()) {
customerPromotion.setPromotionName(promotionDAOImpl.getName(customerOrder.getPromotionId));
customerPromotionDAOImpl.create(customerPromotion);
}
......
while (customerItemIterator.hasNext()) {
customerItemDAOImpl.create(customerItem);
}
}
}
任何想法?
谢谢。
默认行为@Transactional
事务行为是通过对象周围的代理添加的(CustomerService
在你的例子中)。来自参考文档(向下滚动):
在代理模式(默认)下,仅拦截通过代理传入的外部方法调用。这意味着自调用实际上是目标对象中的一个方法调用目标对象的另一个方法,即使被调用的方法被标记为@Transactional,也不会在运行时导致实际的事务。
在您的示例中,外部调用handlingIncomingOrders()
通过代理并到达目标对象(CustomerService
)。然而,随后的调用saveOrderDetails()
是目标对象内部的普通方法调用,因此永远不会调用代理中的事务行为。然而,如果saveOrderDetails()
从另一个类调用时,您会发现事务行为将按预期工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)