baomidou / mybatis-plus

An powerful enhanced toolkit of MyBatis for simplify development
https://baomidou.com
Apache License 2.0
16.38k stars 4.31k forks source link

delete实际没有删除数据,但是返回成功。 #1027

Closed 37764844 closed 5 years ago

37764844 commented 5 years ago

当前使用版本(必须填写清楚,否则不予处理)

mybatis-plus-boot-starter 3.1.0

该问题是怎么引起的?*([最新版](https://search.maven.org/search?q=g:com.baomidou%20a:mybatis-)上已修复的会直接close掉)**

由于没有了service的remove方法没有乐观锁,我追加了一个版本号的条件。 UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("UserId", mUser.getUserId()); updateWrapper.eq("Version", mUser.getVersion()); if(iMUserService.remove(updateWrapper)) {

当条件的版本号和数据库中的版本号不一致的时候,返回的true,但是实际没有更新数据, 怎么才能知道更新不成功?

重现步骤

报错信息

miemieYaho commented 5 years ago

给出你的sql 打印信息

37764844 commented 5 years ago

Preparing: DELETE FROM m_user WHERE UserId = ? AND Version = ? Parameters: 10003(String), 0(Integer) 数据库中的数据是 UserId Version 10003 1

UpdateWrapper updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("UserId", mUser.getUserId()); updateWrapper.eq("Version", mUser.getVersion()); if(iMUserService.remove(updateWrapper)) { return "成功"; } else { return "失败"; } 结果是成功

miemieYaho commented 5 years ago

Preparing和Parameters下面的total呢

37764844 commented 5 years ago

<== Updates: 0 又看了一下源码。 SqlHelper.delBool(baseMapper.delete(wrapper)); sqlhelper的delBool方法 当影响的行数大于等于0的时候返回true。这个方法注释是“删除不存在的逻辑上属于成功” 返回的结果和源码是一致的,但是怎么区分删除数据(影响的行数>0)和没有删除数据(影响的行数=0),因为我用一个Version字段作为乐观锁的验证字段。

nieqiurong commented 5 years ago

已过时此方法,按照影响记录数来判断是否成功,请等待3.1.1发布.