日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MyBatis-Plus 高级功能 —— 乐观锁插件

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MyBatis-Plus 高级功能 —— 乐观锁插件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、引言

先來大概普及一下數據庫鎖的概念

  • 悲觀鎖:時刻保持著一個悲觀的態度,對誰都不信任,總想著別人會修改我的數據,所以為了防止別人修改,每次都會上鎖,防止別人修改自己的數據。導致的后果就是每次想要拿到數據就必須要等待拿到鎖,是一個很浪費時間的過程,如果訪問量很大就是悲觀鎖一個致命的缺陷。

  • 樂觀鎖:樂觀鎖對這個世界都很樂觀,對每個想要獲取數據的操作,他都會認為大家不會對自己的數據進行修改,所以不會上鎖,在訪問量很大的時候相比于悲觀鎖,節省了很多時間,用戶不需要等待獲取鎖。

如果說大量讀取數據操作的時候,適合使用樂觀鎖。如果沖突較多建議使用悲觀鎖。

悲觀鎖實現方式是數據庫采用加鎖的機制,而樂觀鎖最常見的手動就是通過版本號,每次更新的時候需要判斷版本號是否一致,如果一致才能正常更新,反之更新失敗。

二、具體現實

  • 步驟一:配置樂觀鎖插件,這個采用的springboot的配置方式。
@Configuration public class MyBatisPlusConfig {/*** 樂觀鎖插件* @return*/@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor(){return new OptimisticLockerInterceptor();} }
  • 步驟二:在實體類版本號的字段上加注解

/**

  • 版本號
    */
    @Version
    private Integer version;
  • 步驟三:測試調用,從SQL語句得出MP會把設置進去的版本號當作更新條件,并且版本號+1更新進去。
@Test public void update(){// 更新對象User user = new User();user.setEmail("Test1111@email.com");user.setId(1L);// 需要把之前從數據庫讀出來的版本號設置進去user.setVersion(1);int update = userMapper.updateById(user);System.out.println(update); } DEBUG==> Preparing: UPDATE sys_user SET email=?, update_time=?, version=? WHERE id=? AND version=? AND is_delete='0' DEBUG==> Parameters: Test1111@email.com(String), 2019-09-19T16:00:38.149(LocalDateTime), 2(Integer), 1(Long), 1(Integer) DEBUG<== Updates: 1

三、使用注意細節

  • 細節一:支持的數據類型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime

  • 細節二:僅支持 updateById(id) 與 update(entity, wrapper) 方法

  • 細節三:在 update(entity, wrapper) 方法下, wrapper不能復用,這里小編給大家演示一下把,通過執行SQL語句看出,第一次更新是成功了,但是第二次更新失敗了,在條件后面有兩個版本號的條件。

@Test public void updateByMyWrapper() {// 條件構造器QueryWrapper<User> wrapper = Wrappers.query();wrapper.eq("name", "admin");// 對象1User user = new User();user.setEmail("Test@email.com");user.setVersion(2);userMapper.update(user,wrapper);// 對象2User user2 = new User();user2.setEmail("Test2@email.com");user2.setVersion(3);// 注意,注意,這里的wrapper,和上面是是用的同一個userMapper.update(user2,wrapper);} updateFill...... DEBUG==> Preparing: UPDATE sys_user SET email=?, update_time=?, version=? WHERE is_delete='0' AND name = ? AND version = ? DEBUG==> Parameters: Test@email.com(String), 2019-09-19T16:06:26.172(LocalDateTime), 3(Integer), admin(String), 2(Integer) DEBUG<== Updates: 1 updateFill...... DEBUG==> Preparing: UPDATE sys_user SET email=?, update_time=?, version=? WHERE is_delete='0' AND name = ? AND version = ? AND version = ? DEBUG==> Parameters: Test2@email.com(String), 2019-09-19T16:06:26.238(LocalDateTime), 4(Integer), admin(String), 2(Integer), 3(Integer) DEBUG<== Updates: 0

文章轉自

總結

以上是生活随笔為你收集整理的MyBatis-Plus 高级功能 —— 乐观锁插件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。