mybatis_plus的樂觀鎖

 樂觀鎖:總是假設最好的情況,每次讀取數據時認為數據不會被修改(即不加鎖),當進行更新操作時,會判斷這條數據是否被修改,未被修改,則進行更新操作。若被修改,則數據更新失敗,可以對數據進行重試(重新嘗試修改數據)。
    悲觀鎖:總是假設最壞的情況,每次讀取數據時認為數據會被修改(即加鎖),當進行更新操作時,直接更新數據,結束操作后釋放鎖(此處才可以被其他線程讀取)。

樂觀鎖、悲觀鎖使用場景?
  樂觀鎖一般用于讀比較多的場合,盡量減少加鎖的開銷。
  悲觀鎖一般用于寫比較多的場合,盡量減少 類似 樂觀鎖重試更新引起的性能開銷。

樂觀鎖兩種實現方式
方式一:通過版本號機制實現。
  在數據表中增加一個 version 字段。
  取數據時,獲取該字段,更新時以該字段為條件進行處理(即set version = newVersion where version = oldVersion),若 version 相同,則更新成功(給新 version 賦一個值,一般加 1)。若 version 不同,則更新失敗,可以重新嘗試更新操作。

mybatis-plus 實現樂觀鎖(通過 version 機制)
實現思路:
  Step1:取出記錄時,獲取當前version
  Step2:更新時,帶上這個version
  Step3:執行更新時, set version = newVersion where version = oldVersion
  Step4:如果version不對,就更新失敗

mybatis-plus 代碼實現樂觀鎖
Step1:
  配置樂觀鎖插件。
  編寫一個配置類(可以與上例的分頁插件共用一個配置類),將 OptimisticLockerInterceptor 通過 @Bean 交給 Spring 管理。

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Configuration;@Configuration
// 配置掃描mapper的路徑
@MapperScan("com.mapper")
public class MyBatisPlusConfig {// 樂觀鎖插件//    @Bean//    public OptimisticLockerInterceptor optimisticLockerInterceptor() {//        return new OptimisticLockerInterceptor();//    }
}

Step2:
  定義一個數據庫字段 version。

CREATE TABLE test_mybatis_plus_user
(id BIGINT NOT NULL COMMENT '主鍵ID',name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',age INT(11) NULL DEFAULT NULL COMMENT '年齡',email VARCHAR(50) NULL DEFAULT NULL COMMENT '郵箱',create_time timestamp NULL DEFAULT NULL COMMENT '創建時間',update_time timestamp NULL DEFAULT NULL COMMENT '最后修改時間', delete_flag tinyint(1) NULL DEFAULT NULL COMMENT '邏輯刪除(0 未刪除、1 刪除)',version int NULL DEFAULT NULL COMMENT '版本號(用于樂觀鎖, 默認為 1)',PRIMARY KEY (id)
);

?Step3:
  使用 @Version 注解標注對應的實體類。
  可以通過 @TableField 進行數據自動填充。

/*** 版本號(用于樂觀鎖, 默認為 1)*/
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;@Override
public void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "version", Integer.class, 1);
}

package com.config;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.util.Date;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {// 方法1:在3.3.0+版本可以使用strictInsertFill()、strictUpdateFill()方法// 方法2:通用的自動填充方法this.setFieldValByName("gmtCreate", new Date(), metaObject);this.setFieldValByName("gmtModified", new Date(), metaObject);this.setFieldValByName("version", 0, metaObject); //新增就設置版本值為0}@Overridepublic void updateFill(MetaObject metaObject) {// 這里只有為空才會填充數據 所以修改一下// 方法1:在3.3.0+版本可以使用strictUpdateFill()方法try {if (metaObject.hasSetter("gmtModified")) {metaObject.setValue("gmtModified", null);}} catch (Exception e) {e.printStackTrace();}// 方法2:通用的自動填充方法this.setFieldValByName("gmtModified", new Date(), metaObject);}
}

Step4:
  簡單測試一下,可以看一下 控制臺 打印的 sql 語句。?

@Test
public void testVersion() {User user = new User();user.setName("tom").setAge(20).setEmail("tom@163.com");userService.save(user);userService.list().forEach(System.out::println);user.setName("jarry");userService.update(user, null);userService.list().forEach(System.out::println);
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/72763.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/72763.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/72763.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Redis系列:深入理解緩存穿透、緩存擊穿、緩存雪崩及其解決方案

在使用Redis作為緩存系統時,我們經常會遇到“緩存穿透”、“緩存擊穿”和“緩存雪崩”等問題,這些問題一旦出現,會嚴重影響應用性能甚至造成服務不可用。因此,理解這些問題的產生原因和解決方案非常重要。 本文將全面講解緩存穿透…

AT指令集-NBIOT

是什么? 窄帶物聯網(Narrow Band Internet of Things, NB-IoT)成為萬物互聯網絡的一個重要分支支持低功耗設備在廣域網的蜂窩數據連接,也被叫作低功耗廣域網(LPWAN)NB-IoT支持待機時間長、對網絡連接要求較高設備的高效連接NB-Io…

CBNet:一種用于目標檢測的復合骨干網架構之論文閱讀

摘要 現代頂級性能的目標檢測器在很大程度上依賴于骨干網絡,而骨干網絡的進步通過探索更高效的網絡結構帶來了持續的性能提升。本文提出了一種新穎且靈活的骨干框架——CBNet,該框架利用現有的開源預訓練骨干網絡,在預訓練-微調范式下構建高…

c++中字符串string常用的函數

在C中&#xff0c; std::string 類有許多常用函數&#xff0c;以下是一些常見的&#xff1a; 1. length() 或 size() &#xff1a;返回字符串的長度&#xff08;字符個數&#xff09;&#xff0c;二者功能相同。例如&#xff1a; #include <iostream> #include <str…

《保險科技》

自己在保險行業工作很多年&#xff0c;只是接觸了一些數據的內容&#xff0c;對于保險業務的知識了解的很少&#xff0c;想通過這本書補充一下&#xff0c;但是發現這本書就是一些知識的拼接。 先將保險的歷史&#xff0c;后講保險的定義&#xff0c;然后就是吹噓保險行業和互聯…

藍橋杯第13屆真題2

由硬件框圖可以知道我們要配置LED 和按鍵 一.LED 先配置LED的八個引腳為GPIO_OutPut&#xff0c;鎖存器PD2也是&#xff0c;然后都設置為起始高電平&#xff0c;生成代碼時還要去解決引腳沖突問題 二.按鍵 按鍵配置&#xff0c;由原理圖按鍵所對引腳要GPIO_Input 生成代碼&a…

java之IP 工具類

java程序一直需要獲取物理機的ip&#xff0c;寫了一個ip的工具類&#xff0c;感覺日常所需夠了 import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException;/*** IP 工具類*/ public class IpUtil {public static St…

貪心算法作業參考:P1106,P4995,P5019

貪心算法作業參考&#xff1a;P1106&#xff0c;P4995&#xff0c;P5019 P1106 刪數問題 作業批注&#xff1a; 原作業提交&#xff0c;是刪除k個最大的數。 不一定是刪除最大的數。 參考如下&#xff0c;用例&#xff1a; 輸入&#xff1a; 50074897 2輸出&#xff1a; 4…

雙曲空間學習記錄

文章目錄 前期學習內容雙曲空間中的圖卷積神經網絡 前期學習內容 雙曲空間中的圖卷積神經網絡 250318&#xff1a;這個博客的產生原因是我去看了B站上的一個視頻&#xff0c;up說ppt上傳到github上了&#xff0c;但是我去找了一圈也沒有找到&#xff0c;然后想給他留言&#x…

【ES6新特性】默認參數常見用法

ES6新特性之默認參數的多種用法 &#x1f680;默認參數基礎用法 在ES6中&#xff0c;我們可以直接在函數參數列表中為參數設置默認值&#xff1a; // ES5的實現方式 function greet(name) {name name || Guest;console.log(Hello, ${name}!); }// ES6默認參數寫法 function…

LORA的AB矩陣是針對Transformer的多頭還是MLP

LORA的AB矩陣是針對Transformer的多頭還是MLP Transformer中的矩陣是一個整體還是分開的每個小矩陣 在LORA(Low-Rank Adaptation)中,AB矩陣的應用位置和Transformer中的矩陣拆分方式如下: 1. LORA的AB矩陣作用對象 LORA的AB矩陣主要作用于Transformer的多頭注意力模塊和…

【大模型基礎_毛玉仁】2.4 基于 Encoder-Decoder 架構的大語言模型

更多內容&#xff1a;XiaoJ的知識星球 目錄 2.4 基于 Encoder-Decoder 架構的大語言模型2.4.1 Encoder-Decoder 架構2.4.2 T5 語言模型1&#xff09;T5 模型結構2&#xff09;T5 預訓練方式3&#xff09;T5 下游任務 2.4.3 BART 語言模型1&#xff09;BART 模型結構2&#xff0…

browser-use WebUI + DeepSeek 基于AI的UI自動化解決方案

browser-use WebUI 一、browser-use是什么Browser-use采用的技術棧為&#xff1a; 二、browser-use webui 主要功能使用場景 三、使用教程1.python 安裝2、把項目clone下來3、安裝依賴4、配置環境5、啟動6、配置1.配置 Agent2.配置要用的大模型3.關于瀏覽器的一些設置 四、Deep…

WPF CommunityToolkit.MVVM庫的簡單使用

CommunityToolkit.MVVM 是 .NET 社區工具包中的一部分&#xff0c;它為實現 MVVM&#xff08;Model-View-ViewModel&#xff09;模式提供了一系列實用的特性和工具&#xff0c;能幫助開發者更高效地構建 WPF、UWP、MAUI 等應用程序。以下是關于它的詳細使用介紹&#xff1a; 1…

Windows安裝Apache Maven 3.9.9

第一步下載資源 官網&#xff1a;下載 Apache Maven – Maven 環境變量配置 M2_HOME 指向bin目錄 MAVEN_HOME 指向根目錄 M2_HOME 不確定是否必須要 Path配置 &#xff0c;需要注意MAVEN順序應當在java之前 驗證是否安裝成功&#xff0c;在cmd中以管理員方式打開&#xff0c…

【spring-boot-starter-data-neo4j】創建結點和查找結點操作

配置連接neo4j # application.properties spring.neo4j.uribolt://localhost:7687 spring.neo4j.authentication.usernameneo4j spring.neo4j.authentication.password你的密碼定義實體類 package com.anmory.platform.GraphService.Dao;import org.springframework.data.neo…

pytorch小記(十三):pytorch中`nn.ModuleList` 詳解

pytorch小記&#xff08;十三&#xff09;&#xff1a;pytorch中nn.ModuleList 詳解 PyTorch 中的 nn.ModuleList 詳解1. 什么是 nn.ModuleList&#xff1f;2. 為什么不直接使用普通的 Python 列表&#xff1f;3. nn.ModuleList 的基本用法示例&#xff1a;構建一個包含兩層全連…

Excel導出工具類--復雜的excel功能導出(使用自定義注解導出)

Excel導出工具類 前言: 簡單的excel導出,可以用easy-excel, fast-excel, auto-poi,在導出實體類上加上對應的注解,用封裝好的工具類直接導出,但對于復雜的場景, 封裝的工具類解決不了,要用原生的excel導出(easy-excel, fast-excel, auto-poi都支持原生的) 業務場景: 根據…

批量測試IP和域名聯通性2

在前面批量測試IP和域名聯通性-CSDN博客的基礎上&#xff0c;由于IP和域名多樣性&#xff0c;比如帶端口號的192.168.1.17:17&#xff0c;實際上應該ping 192.168.1.17。如果封禁http://www.abc.com/a.exe&#xff0c;實際可ping www.abc.com。所以又完善了代碼。 echo off se…

國產編輯器EverEdit - 語法著色文件的語法

1 語法著色定義(官方文檔) 1.1 概述 EverEdit有著優異的語法著色引擎&#xff0c;可以高亮現存的絕大多數的編程語言。在EverEdit的語法著色中有Region和Item兩個概念&#xff0c;Region表示著不同的區塊。而Item則代表著這些區塊中不同的部分。一般情況下&#xff0c;Region…