mybatisplus----CRUD操作之更新操作(樂觀鎖)
阿新 • • 發佈:2020-11-13
樂觀鎖
在面試過程中,我們經常會被問到樂觀鎖,悲觀鎖!這個其實非常簡單!
樂觀鎖:故名思意十分樂觀,它總是認為不會出現問題,無論幹什麼不去上鎖!如果出現了問題,再次更新值測試。
悲觀鎖:故名思意十分悲觀,它總是認為總是出現問題,無論幹什麼都會上鎖!再去操作!
當要更新一條記錄的時候,希望這條記錄沒有被別人更新
樂觀鎖實現方式:
- 取出記錄時,獲取當前version
- 更新時,帶上這個version
- 執行更新時, set version = newVersion where version = oldVersion
- 如果version不對,就更新失敗
簡單解釋:
樂觀鎖:1、先查詢,獲得版本號version =1
--A執行緒
update user set name ="kuangshen",version = version +1
where id = 2 and version = 1
--B執行緒搶先完成,這個時候version =2,會導致A修改失敗!
update user set name ="kuangshen",version = version +1
where id =2 and version =1
測試一下MP的樂觀鎖外掛
1、給資料庫中增加version欄位!
2、我們實體類加對應的欄位
@Version//樂觀鎖Version註解
private Integer version;
3,註冊元件:
package com.config; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @MapperScan("com.hui.mapper")//把掃描mapper介面的註解移動到這個配置類上面 @EnableTransactionManagement//事務註解預設開啟 @Configuration//配置類 public class MybatisplusConfig { //註冊樂觀鎖外掛 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } }
4.測試:
樂觀鎖的情況下正常更新成功的情況:
//測試樂觀鎖成功
@Test
void testOptimisticLocker(){
User user = userMapper.selectById(5L);
Integer version = user.getVersion();
System.out.println("第一次查詢封裝到user中的版本是:"+version);
//接下來進項修改
user.setAge(23);
user.setName("本傑明");
userMapper.updateById(user);
}
結果成功:
測試樂觀鎖失敗的情況:
//測試樂觀鎖失敗
@Test
void testOptimisticLocker2() {
User user1 = userMapper.selectById(1L);
user1.setName("瓜瓜");
//接下來這個操作模擬執行緒2的操作
User user2 = userMapper.selectById(1L);
user2.setName("瓜瓜2");
userMapper.updateById(user2);//這個時候version就會更新成2
//然後下面的user的更新操作因為版本還停留在1,所以會更新失敗
userMapper.updateById(user1);
//所以最後版本是2,名字是瓜瓜2
}
資料庫中的結果: