生活随笔
收集整理的這篇文章主要介紹了
MyBatis-Plus 高级功能 —— 乐观锁插件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、引言
先來大概普及一下數據庫鎖的概念
-
悲觀鎖:時刻保持著一個悲觀的態度,對誰都不信任,總想著別人會修改我的數據,所以為了防止別人修改,每次都會上鎖,防止別人修改自己的數據。導致的后果就是每次想要拿到數據就必須要等待拿到鎖,是一個很浪費時間的過程,如果訪問量很大就是悲觀鎖一個致命的缺陷。
-
樂觀鎖:樂觀鎖對這個世界都很樂觀,對每個想要獲取數據的操作,他都會認為大家不會對自己的數據進行修改,所以不會上鎖,在訪問量很大的時候相比于悲觀鎖,節省了很多時間,用戶不需要等待獲取鎖。
如果說大量讀取數據操作的時候,適合使用樂觀鎖。如果沖突較多建議使用悲觀鎖。
悲觀鎖實現方式是數據庫采用加鎖的機制,而樂觀鎖最常見的手動就是通過版本號,每次更新的時候需要判斷版本號是否一致,如果一致才能正常更新,反之更新失敗。
二、具體現實
- 步驟一:配置樂觀鎖插件,這個采用的springboot的配置方式。
@Configuration
public class MyBatisPlusConfig {@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");User user
= new User();user
.setEmail("Test@email.com");user
.setVersion(2);userMapper
.update(user
,wrapper
);User user2
= new User();user2
.setEmail("Test2@email.com");user2
.setVersion(3);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 高级功能 —— 乐观锁插件的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。