文章目錄
-
- 一.樂觀鎖
- 二.mp實作樂觀鎖
-
- 1.首先在資料庫中增加version字段
- 2.在實體類中增加字段
- 3.增加配置類,配置樂觀鎖插件
- 4.測試
一.樂觀鎖
樂觀鎖解決丢失更新的問題
那麼我們如何實作樂觀鎖呢,一般來說有以下2種方式:
1.使用資料版本(Version)記錄機制實作,這是樂觀鎖最常用的一種實作方式。何謂資料版本?即為資料增加一個版本辨別,一般是通過為資料庫表增加一個數字類型的 “version” 字段來實作。當讀取資料時,将version字段的值一同讀出,資料每更新一次,對此version值加一。當我們送出更新的時候,判斷資料庫表對應記錄的目前版本資訊與第一次取出來的version值進行比對,如果資料庫表目前版本号與第一次取出來的version值相等,則予以更新,否則認為是過期資料。用下面的一張圖來說明:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yMxQ2Y5QmMkRmYkhTNkdDNhRzM4UzM1YGZkVWZ5IzYm9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
如上圖所示,如果更新操作順序執行,則資料的版本(version)依次遞增,不會産生沖突。但是如果發生有不同的業務操作對同一版本的資料進行修改,那麼,先送出的操作(圖中B)會把資料version更新為2,當A在B之後送出更新時發現資料的version已經被修改了,那麼A的更新操作會失敗。
2.樂觀鎖定的第二種實作方式和第一種差不多,同樣是在需要樂觀鎖控制的table中增加一個字段,名稱無所謂,字段類型使用時間戳(timestamp), 和上面的version類似,也是在更新送出的時候檢查目前資料庫中資料的時間戳和自己更新前取到的時間戳進行對比,如果一緻則OK,否則就是版本沖突。
二.mp實作樂觀鎖
1.首先在資料庫中增加version字段
2.在實體類中增加字段
注意:記得加@version注解
//樂觀鎖版本号
@TableField(fill = FieldFill.INSERT)
@Version
private Integer version;
3.增加配置類,配置樂觀鎖插件
package com.example.test.mpdemo.config;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
/**
* 樂觀鎖插件
* @return
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
4.測試
//測試樂觀鎖
@Test
public void testOptimisticLocker(){
//1.根據id查詢使用者資訊
User user = userMapper.selectById(6);
//2.修改資料,調用方法實作修改
user.setName("bbb");
int i = userMapper.updateById(user);
System.out.println(i);
}