正常情况下,我们想要的是,当乐观锁不对的时候要一个反馈,例如:版本号不一致,请刷新页面重新获取数据。
在没有@Version注解的时候,一般我们会进行显示校验。例如下图:
updateById方法使用演示
有了@Version注解之后,可以直接使用updateById方法的返回值进行判断。
可以看到当乐观锁不对的时候,updateById方法返回的是false。
获取到对应的SQL语句可以看到,在更新条件中添加上了修改后的version条件。
虽然这条语句是正常执行的,但是因为没有查到满足条件的数据,也就不会执行更新操作,updateById方法给返回了个false。
updateBatchById方法的问题
如果是使用的Mybatis-Plus框架的updateBatchById方法会有问题。
一开始是设想的跟updateById方法一样,当设置的乐观锁查不到数据进行更新的时候,会返回false,因此有了上面截图的控制。(注:这是个测试代码!)
目前数据库中的这三条数据乐观锁分别是7,5,7。
在批量修改的时候,换成了6,4,6。
可以看到响应结果是正常的,没有抛出异常。
现在这种的代码,在乐观锁不对的时候,updateBatchById返回的是true。
这里指的是sql语句是正常执行的,只不过没有匹配到对应的数据而进行更新操作。
在乐观锁不对的情况下,想要更新的数据不会被更新,也不会得到乐观锁不对的响应。
上述两个方法的比较
接着又写了一段测试代码。
可以注意到针对同一个数据,updateById方法和updateBatchById方法的返回值是不一样的。
来到updateBatchById方法中看了一下。
这个updateBatchById方法只要核心业务不报异常,就返回true,在使用@Version注解的时候会有一些问题。。。使用单条更新的updateById方法的返回值是没问题的!