mybatis plus 乐观锁

如果关键表没有加锁,则多个线程对同一条记录进行操作的时候,就会重复操作
加锁之后可以避免这个问题
加锁前:
如果有两个线程同时分别执行这两个语句,结果name 可能是coding1 也可能是 coding2,而且还会存在覆盖的情况,两个sql都执行成功了

update `id_info_2` set `name` = 'coding1'  where id = 1 ;
update `id_info_2` set `name` = 'coding2'  where id = 1 ;

加锁后:
如果有两个线程同时分别执行这两个语句,结果name 可能是coding1 也可能是 coding2,只有一个sql执行成功,另一个执行失败。(先执行的成功,后执行的失败)

update `id_info_2` set `name` = 'coding1' , `version` = `version` + 1 where id = 1 and `version` = 1;

update `id_info_2` set `name` = 'coding2' , `version` = `version` + 1 where id = 1 and `version` = 1;

在数据表中增加version字段
在表中新增int类型的version字段,默认值为1.

1. 插件配置

  1. 新增一个config
  2. 在这个config中启用乐观锁
  3. 使用EnableTransactionManagement注解,使程序可以提交事务
  4. 在启动类里面移除MapperScan注解
  5. 在config中使用MapperScan注解
@EnableTransactionManagement
@Configuration
@MapperScan("top.willnew.tools.user.mapper")
public class MybatisPlusConfig {

    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor() {
        return new OptimisticLockerInterceptor();
    }
}

2. 修改实体类,新增@Version注解

@Version
private Integer version;

特别说明:

  • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1
  • newVersion 会回写到 entity 中
  • 仅支持 updateById(id) 与 update(entity, wrapper) 方法
  • 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 乐观锁插件 主要适用场景 意图: 当要更新一条记录的时候,希望这条记录没有被别人更新 乐观锁实现方式: 取出记录时...
    天一方蓝阅读 2,558评论 1 17
  • CloudJavaBackendSummaries1、开发环境eclipse工程,引入jw仓库的jw-base,3...
    燕京博士阅读 1,136评论 0 0
  • 这部分主要是开源Java EE框架方面的内容,包括Hibernate、MyBatis、Spring、Spring ...
    杂货铺老板阅读 1,424评论 0 2
  • 一、逻辑删除(假删除) 1、application.yml 加入配置(如果你的默认值和mp默认的一样,该配置可无)...
    任未然阅读 550评论 0 0
  • 2018年4月2日 星期一 晴 停电了。 虽然手机里还有百分之六十的电,还是趁回家时充满了,比较起来,真是...
    米垛阅读 576评论 72 53