Mybatis-Plus实现乐观锁

丢失更新

  1. 如果不考虑事务的隔离性,会产生两类问题
    • 读的问题:脏读 不可重复读 幻读
    • 写的问题:丢失更新(多个人同时修改同一条记录,谁最后提交,会把之前提交的数据覆盖)
  2. 丢失更新例子
	id     money
	1      500
	
	lucy            mary
	开始事务         开始事务
	
	500 -> 8000     500 -> 200
	首先提交事务      之后提交事务
	
	某天lucy回来看,工资明明改成了8000,为什么变成了200

丢失更新解决方案

  1. 悲观锁
    lucy在操作数据时,别人都不能操作,只有等她操作完成之后,别人才可以操作(串行操作)
  2. 乐观锁
	id     money     version
	1      500       1
	通过版本号进行控制,比较当前版本和数据库中的版本是否一样,一样才能修改,每次修改后版本号+1
	mary刚开始获取的版本号是1,lucy提交后版本号变为2,这时mary再提交修改就会失效

MP中实现乐观锁

  1. 数据库中添加version字段,表示版本号
  2. 元对象处理器接口添加version的insert默认值
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
        // 使用MP进行添加操作,该方法执行
        @Override
        public void insertFill(MetaObject metaObject) { // metaObject 元数据,即数据的数据(比如表中的字段)
            //属性名称,不是字段名称
            this.setFieldValByName("version", 1, metaObject);
        }
    }
  1. 实体类中添加version字段,并添加@Version注解
    @Version
    @TableId(fill = FieldFill.INSERT) // 第一次加数据时使其有个默认值1
    private Integer version;
  1. 在配置类中配置乐观锁插件
    @Configuration // 表示配置类
    @MapperScan("com.atguigu.mybatis_plus.mapper") // 把启动类中的移过来
    public class EduConfig {
        /**
         * 乐观锁插件
         */
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值