赞
踩
第一种
Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用。
第二种
在类内部调用调用类内部@Transactional标注的方法。这种情况下也会导致事务不开启。
既然事务管理是基于动态代理对象的代理逻辑实现的,那么如果在类内部调用类内部的事务方法,这 个调用事务方法的过程并不是通过代理对象来调用的,而是直接通过this对象来调用方法,绕过的代理对 象,肯定就是没有代理逻辑了。
解决方法
1.可以在service层 注入自己 用自己调用方法 或者
2.新建一个service 通过注入新建的service调用方法
3.可以通过编程式事务管理 TransactionTemplate
@Autowired
private TransactionTemplate transactionTemplate;
...
public void save(final User user) {
queryData1();
queryData2();
transactionTemplate.execute((status) => {
addData1();
updateData2();
return Boolean.TRUE;
})
}
4.在该Service类中使用AopContext.currentProxy()获取代理对象
@Servcie
publicclass ServiceA {
public void save(User user) {
queryData1();
queryData2();
((ServiceA)AopContext.currentProxy()).doSave(user);
}
@Transactional(rollbackFor=Exception.class)
public void doSave(User user) {
addData1();
updateData2();
}
}
第三种
事务方法内部捕捉了异常,没有抛出新的异常,导致事务操作不会进行回滚。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。