For循环下单独事务并且存在this指向
声明式事务中对this调用的事务方法是无效的,因为this指向无法被aop代理,这里
需要改为使用当前代理类进行代理
// 获取自身代理对象
AopContext.currentProxy()
使用该方法需要在springboot启动类上加
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
如下所示
@Service
public class UserService implements IUserService {
@Autowired
private UserMapper userMapper;
@Override
public Long addUser(UserAddDTO userAddDTO) {
User user = new User();
BeanUtils.copyProperties(userAddDTO, user);
((UserService) AopContext.currentProxy()).addUserToDb(user);
return user.getUserId();
}
@Transactional
public void addUserToDb(User user) {
this.userMapper.insert(user);
// 下方代码会触发报错
int i = 1 / 0;
}
}
如果需要循环调用且单独事务
这里需要调整级别,以及需要手动回滚
@Transactional(propagation = Propagation.REQUIRES_NEW)//关注点一!!!
public void closeOrder() {
try{
//这里,执行你自己的业务,比如商品库存回退,订单状态改变,操作流水等。
//重点关注的是@Transactional注解和TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()
}catch (Exception e){
//这一段表示手动回滚事务,此处的try-catch,是表示当前方法如果出错了,
//那我就自己消化这个异常,不再往外抛,处理异常的方式是手动回滚事务。
//如此,每个循环体都自己处理自己的事务,不管成功与失败,都不影响整个循环
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//关注点二!!!
}
}
评论区