Skip to content

事务管理

系统在开发过程中经常遇到整体的方法,这种方法由多个执行步骤,如果一个步骤出现问题,整体方法都要回滚之前的操作,防止出现脏数据,这个时候就要使用事务,比如订单创建,会员账户变动,添加用户以及关联角色等

事务配置

niucloud 使用 springboot 已经集成了事务的方法,只需要在方法前增加注解 @Transactional 即可,例如支付方法

java
    /**
     * 支付
     *
     * @param param
     * @return
     */
    @Override
    @Transactional
    public Object pay(PayParam param) {
        Pay pay = this.checkOrCreate(param.getTradeType(), param.getTradeId());
        if (pay.getBody().length() > 15) {
            pay.setBody(pay.getBody().substring(0, 15) + "...");
        }
        param.setPay(pay);
        param.setNotifyUrl(buildNotifyUrl(param.getChannel(), param.getType(), "pay"));

        BasePay driver = this.driver(param.getChannel(), param.getType());

        Map<String, Object> json = new HashMap<>();
        json.put("openid", param.getOpenid());
        pay.setJson(JSONUtil.toJsonStr(json));
        this.payMapper.updateById(pay);

        return driver.pay(param);
    }

推荐使用事务尽量避免嵌套使用,同时事务中尽量不包含查询操作只需要处理数据修改或者删除操作

例如订单,相关的业务数据在事务之前已经查询组装,事务中只需要对订单添加或者修改处理即可

java
    /**
     * 创建订单
     *
     * @param vo
     * @return
     */
    protected OrderCreateResultVo createOrder(OrderCreateDataVo vo, MallOrder order, List<MallOrderGoods> orderGoods) {
        // 添加订单表
        order.setCreateTime(System.currentTimeMillis() / 1000);
        mallOrderMapper.insert(order);
        vo.setOrderId(order.getOrderId());

        // 添加订单项表
        for (MallOrderGoods item : orderGoods) {
            item.setOrderId(order.getOrderId());
            item.setStatus(1);
            mallOrderGoodsMapper.insert(item);
        }
    }

基于 MIT 协议发布