复制代码

为懒人提供无限可能,生命不息,code不止

人类感性的情绪,让我们知难行难
我思故我在
日拱一卒,功不唐捐
  • 首页
  • 前端
  • 后台
  • 数据库
  • 运维
  • 资源下载
  • 实用工具
  • 接口文档工具
  • 登录
  • 注册

ERP

【原创】乐观锁及mybatis-plus的乐观锁

作者: whooyun发表于: 2024-10-29 18:52


锁是解决基于共享数据,共享变量需要进行修改产生的并发,修改前后数据不一致的问题
例如:银行账户有10块,张三,李四同时往一个账户(并发)转入2元,这时候就有可能最终的余额不是14块,所以需要用到乐观锁来确定大家转钱的顺序(version+1)


使用乐观锁的过程
读取当前状态:事务开始时,首先读取相关账户的当前余额以及版本号(或时间戳)。
计算新状态:根据业务逻辑计算出新的余额值。
尝试更新:当尝试更新数据库中的账户余额时,检查版本号是否与最初读取时相同。
冲突检测:
如果版本号没有变化,说明在这段时间内没有其他事务修改过这些账户,可以安全地更新余额,并递增版本号。
如果版本号已经变化,说明有其他事务在这期间修改了账户信息,这时当前事务将被回滚或者重新执行整个过程。


mybatis-plus使用方式
1、在po实体类中的属性上增加 @Version private Integer version;

2、自定义 @Configuration MyBatisPlusConfig 中的OptimisticLockerInnerInterceptor插件

3、需要注意mybatis-plus乐观锁只是实现了字段version的更新,即:version=version+1,where 后面的version=?需要自己处理

        val oldPar = pbService.getById(Id);
        val updatePartition = Partition().apply {
            id = ptId
            remark = newPartition.remark
            version = oldPar.version  //只有增加这行,where后面才会主动拼接where version=? 
        }
         pbService.updateById(updatePartition)

4、当并发量非常高时,可能每个人拿到的version都是都一个值,这个时候update失败率就会非常高,也就是说只能转用悲观锁了