侧边栏壁纸
博主头像
宁静致远博主等级

行动起来,活在当下

  • 累计撰写 14 篇文章
  • 累计创建 11 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

For循环下单独事务并且存在this指向

Administrator
2024-03-28 / 0 评论 / 0 点赞 / 7 阅读 / 1880 字

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();//关注点二!!!
    }
}

0

评论区