记一次mybatisplus.IService.saveOrUpdate可能导致脏数据

 com.baomidou.mybatisplus.extension.service.IService.saveOrUpdate

@version 乐观锁机制

        // 执行saveOrUpdate操作
        //
        // 注意: 如果在entity中version字段加了@version.
        // 在使用saveOrUpdate这个方法时.一定要注意使用version字段.它在sql的where后会加version...那么
        // 当传入的version值和数据库不一致时.则无法命中到数据.
        // 这时saveOrUpdate在操作数据时updateById返回false.这时候saveOrUpdate就会去执行save操作.这样导致脏数据出现的情况.
        // 切记

 
        // 执行saveOrUpdate操作
        //
        // 注意: 如果在entity中version字段加了@version.
        // 在使用saveOrUpdate这个方法时.一定要注意使用version字段.它在sql的where后会加version...那么
        // 当传入的version值和数据库不一致时.则无法命中到数据.
        // 这时saveOrUpdate在操作数据时updateById返回false.这时候saveOrUpdate就会去执行save操作.这样导致脏数据出现的情况.
        // 切记
        boolean res = userService.saveOrUpdate(userInfo);

 com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.saveOrUpdate的实现方法

/**
     * <p>
     * TableId 注解存在更新记录,否插入一条记录
     * </p>
     *
     * @param entity 实体对象
     * @return boolean
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean saveOrUpdate(T entity) {
        if (null != entity) {
            Class<?> cls = entity.getClass();
            TableInfo tableInfo = TableInfoHelper.getTableInfo(cls);
            if (null != tableInfo && StringUtils.isNotEmpty(tableInfo.getKeyProperty())) {
                Object idVal = ReflectionKit.getMethodValue(cls, entity, tableInfo.getKeyProperty());
                if (StringUtils.checkValNull(idVal)) {
                    return save(entity);
                } else {
                    /*
                     * 更新成功直接返回,失败执行插入逻辑
                     */
                    return updateById(entity) || save(entity);
                }
            } else {
                throw ExceptionUtils.mpe("Error:  Can not execute. Could not find @TableId.");
            }
        }
        return false;
    }

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值