• Mybatis-Plus实现乐观锁


    丢失更新

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

    丢失更新解决方案

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

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 实体类中添加version字段,并添加@Version注解
        @Version
        @TableId(fill = FieldFill.INSERT) // 第一次加数据时使其有个默认值1
        private Integer version;
    
    • 1
    • 2
    • 3
    1. 在配置类中配置乐观锁插件
        @Configuration // 表示配置类
        @MapperScan("com.atguigu.mybatis_plus.mapper") // 把启动类中的移过来
        public class EduConfig {
            /**
             * 乐观锁插件
             */
            @Bean
            public OptimisticLockerInterceptor optimisticLockerInterceptor() {
                return new OptimisticLockerInterceptor();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    etcd java 客户端jetcd库踩坑日志
    tree命令详解(输出目录树层结构,显示目录和文件)
    Element-UI el-select下拉框多选实现全选
    前端如何实现网页变灰功能的?
    C++ 内存管理
    Centos7.9安装Nginx
    Win11如何关闭最近打开项目?Win11关闭最近打开项目的方法
    webpack5基础--05_处理图片资源
    leetcode 马拉松 6.27
    LeetCode刷题--思路总结记录
  • 原文地址:https://blog.csdn.net/qq_41829337/article/details/126190483