Skip to content

事务管理

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

事务配置

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

java
    /**
     * 支付
     * @param param
     * @return
     */
    @Override
    @Transactional
    public Object pay(PayParam param) {
        Pay pay = this.checkOrCreate(param.getSiteId(), param.getTradeType(), param.getTradeId());
        param.setPay(pay);
        param.setNotifyUrl(buildNotifyUrl(param.getSiteId(), param.getChannel(), param.getType(), "pay"));
        return this.driver(param.getSiteId(), param.getChannel(), param.getType()).pay(param);
    }

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

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

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

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

基于 MIT 协议发布