MybatisPlus入門(十一)MybatisPlus-樂觀鎖

努力--坚持發表於2024-11-25

  一、樂觀鎖


修改操作中的問題;樂觀鎖,瑣是用來解決併發問題的。

例如秒殺業務, 上了100個秒殺單子, 如果到了最後一個, 8個人一起買,會出現問題,
賣出第0號 -1號 -2號,小型併發解決方案:樂觀鎖。

  二、Mybatis-Plus樂觀鎖實現步驟


Mybatis-Plus樂觀鎖實現步驟:

步驟一:資料庫表中新增鎖標記欄位
資料庫加欄位;user表 新增version欄位, 預設值設定為1


步驟二:實體類中新增對應欄位,並設定當前欄位為邏輯刪除標記欄位

public class User {
  private Long id;
   @Version
  private Integer version;
}


步驟三:配置樂觀鎖攔截器實現鎖機制對應的動態SQL語句拼裝

需求:執行修改操作SQL拼接新增條件,開攔截器,像分頁攔截器一樣;

update set abc=1,version = version + 1 where version =1

@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mpInterceptor() {
        //1.定義Mp攔截器
        MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor();
        //2.新增具體的攔截器
        mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        //3.新增樂觀鎖攔截器
        mpInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        return mpInterceptor;
    }
}


步驟四:使用樂觀鎖機制在修改前必須先獲取到對應資料的verion方可正常進行

       //1.先透過要修改的資料id將當前資料查詢出來
        User user = userDao.selectById(3L);
        //2.將要修改的屬性逐一設定進去
        user.setName("Jock888");
        userDao.updateById(user);


演示併發修改測試:

       //1.先透過要修改的資料id將當前資料查詢出來
        User user = userDao.selectById(3L);     //version=3
 
        User user2 = userDao.selectById(3L);    //version=3
        //2.將要修改的屬性逐一設定進去
        user2.setName("Jock aaa");
        userDao.updateById(user2);              //version=>4
        
        //2.將要修改的屬性逐一設定進去
        user.setName("Jock bbb");
        userDao.updateById(user);               //verion=3,條件不成立,修改失敗


測試成功。

相關文章