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

本文讲解了在使用Mybatis Plus的saveOrUpdate方法时,如何正确处理乐观锁机制,防止脏数据和版本不一致带来的问题。重点提醒务必在entity中的version字段配合使用,并解释了saveOrUpdate操作的逻辑和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值