1. 程式人生 > 實用技巧 >mybatisplus----CRUD操作之更新操作(樂觀鎖)

mybatisplus----CRUD操作之更新操作(樂觀鎖)

樂觀鎖


在面試過程中,我們經常會被問到樂觀鎖,悲觀鎖!這個其實非常簡單!


樂觀鎖:故名思意十分樂觀,它總是認為不會出現問題,無論幹什麼不去上鎖!如果出現了問題,再次更新值測試。

悲觀鎖:故名思意十分悲觀,它總是認為總是出現問題,無論幹什麼都會上鎖!再去操作!

當要更新一條記錄的時候,希望這條記錄沒有被別人更新
樂觀鎖實現方式:

  • 取出記錄時,獲取當前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


    }

資料庫中的結果: