SpringBoot + Mybatis-Plus中樂觀鎖實現

  • 悲觀鎖

    悲觀鎖是一種悲觀思想,它認為數據很可能會被別人所修改

    所以總會對數據進行上鎖,讀操作和寫操作都會上鎖,性能較低,使用較少!

  • 樂觀鎖

    樂觀鎖是一種樂觀思想,它認為數據并不一定會被別人所修改

    所以讀操作不會上鎖,但寫操作時會先判斷當前數據是否被修改過(一般采用版本號機制來實現 ) ?

樂觀鎖的實現方式:

  • 在表中添加一個 version 字段,表示數據的版本

  • 修改數據時首先判斷自己當前擁有的 version 和數據庫中的 version 是否一致

  • 如果一致,則修改數據,同時將 version 加 1,表示數據版本發生了變化

  • 如果不一致,則修改失敗,表示數據被別人修改過。

步驟:

  1. 在實體類的字段上加上@Version注解

    @Version // 樂觀鎖注解
    private Integer version;
  2. 配置MybatisPlusConfig

    @Configuration
    @MapperScan("net.wanho.mapper")
    public class MyBatisPlusConfig {/*** 攔截器*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 分頁插件interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));// 樂觀鎖插件interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());return interceptor;}}
  3. 測試

    修改數據時執行的sql語句:UPDATE product SET name=?, price=?, version=? WHERE id=? AND version=?

    • 修改的條件中,對 version 做了判斷,只有和當前擁有的 version 一致才進行修改

    • 修改的字段中,對 version 做了+1

  4. 判斷是否修改失敗

    如果修改失敗,重新獲取商品信息,再次修改

    if (result2 == 0) {// 5.小王修改失敗,重新獲取商品信息p2 = productMapper.selectById(1);// 6.小王將商品減了30元,存入了數據庫p2.setPrice(p2.getPrice() - 30);result2 = productMapper.updateById(p2);System.out.println("小王修改結果:" + result2);
    }

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

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

相關文章

成為程序員后我都明白了什么?從入行到棄坑?

作為一個入行近10年的php程序員,真心感覺一切都才剛開始,對計算機,編程語言的理解也好,程序員中年危機也罷,之前都是聽別人說的,真的自己到了這個水平,這個年齡才深刻體會到這其中的種種。 我一…

測試基礎05:軟件測試的分類

課程大綱 1、兩種架構(Architecture) 1.1、B/S(Browser/Server) 瀏覽器服務器架構(大體3步):用戶通過瀏覽器向服務器發出請求,服務器處理請求,將結果通過網絡返回到用戶…

使用Webcam實現攝像頭的開啟和關閉,并保存和復制圖片

實現思路 0,將webcam的jar文件傳入項目中 1,顯示攝像頭的地方:創建一個畫板,在畫板上添加開啟和關閉按鈕 2,設置開啟和關閉功能:創建一個類實現動作監聽器,進而實現監聽動作按鈕 3&#xff…

【數據結構與算法篇】二叉樹鏈式結構及實現

【數據結構與算法篇】二叉樹鏈式結構及實現 🥕個人主頁:開敲🍉 🔥所屬專欄:每日刷題🍍 🌼文章目錄🌼 4. 二叉樹鏈式結構的實現 4.1 前置說明 4.2 二叉樹的遍歷 4.2.1 前序、中序以及…

通過ssh在本地打開遠程服務器的網頁

用途 在遠程服務器使用jupyter notebook或者tensorboard等時,在本地打開服務器端的網頁的方式有很多比如可以使用MobaXterm工具等,此方法可參考https://blog.csdn.net/cc__cc__/article/details/108060618?spm1001.2014.3001.5502。 若直接使用ssh則可…

C++感受11-Hello Object 成員版

當一個C程序員在設計類型時,他在想什么? 這一類型的對象,需要擁有哪些屬性數據?這一類型的對象,它將擁有哪些功能?這一類型的對象,它的各個屬性和功能之間,有哪些關聯關系&#xff1…

OceanBase的存儲架構與傳統LSM-Tree架構的異同|OceanBase數據轉儲合并技術解讀(二)

前篇博文將OceanBase的存儲架構巧妙地與自然界中的“水生態”進行了類比,今日我們轉變視角,聚焦在與擁有相同LSM-Tree架構的其他產品的比較,深入探討OceanBase相較于它們所展現出的獨特性能。 眾所周知,OceanBase數據庫的存儲引擎…

element-ui 前端ui框架用法開發指南(2024-05-22)

Element,一套為開發者、設計師和產品經理準備的基于 Vue 2.0 的桌面端組件庫 1、npm安裝 // npm安裝:npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在線引入 訪問最新版本的資源地址 - element-uiThe CDN for element-u…

RedHat9 | DNS剖析-配置主DNS服務器實例

一、實驗環境 1、BIND軟件包介紹 BIND軟件是一款開放源碼的DNS服務器軟件,由美國加州大學Berkeley分校開發和維護,全稱為Berkeley Internet Name Domain。該軟件在DNS(域名系統)領域具有重要地位,是目前世界上使用最…

使用OpenCV dnn c++加載YOLOv8生成的onnx文件進行目標檢測

在網上下載了60多幅包含西瓜和冬瓜的圖像組成melon數據集,使用 LabelMe 工具進行標注,然后使用 labelme2yolov8 腳本將json文件轉換成YOLOv8支持的.txt文件,并自動生成YOLOv8支持的目錄結構,包括melon.yaml文件,其內容…

信息系統管理工程師問答題

信息系統管理工程師問答題 系統管理安全兩方面 安全測試 入侵檢測系統的功能 用戶標識與驗證常用的3種方法 (1) 要求用戶輸入一些保密信息,例如用戶名稱和密碼; (2) 采用物理識別設備,例如訪問卡、鑰匙或令牌; (3) 采用生物統計學…

Python怎樣定位并刪除Sql語句中不確定的查詢條件

1.問題場景描述: 在sql語句中經常會有查詢條件是:查找多個訂單簽訂日期范圍的數據,但具體的日期范圍是不確定,我們如何來查找定位 例如:查詢條件語句的部分如下圖: 目標是: 1)定位字符串:t_contract_order.sign_date 2)最終得到結果: 解決問題思路: 1)定位要找的字符串起始位置…

【學習心得】PyTorch的知識要點復習(持續更新)

PyTorch知識要點復習,目的是為了鞏固PyTorch基礎、快速回顧、深化理解PyTorch框架。這篇文章會持續更新。 一、本文的一些說明 知識點梳理:我將PyTorch的核心概念和高級技巧進行了系統化的整理,從基礎的張量操作到復雜的模型構建與訓練。這樣…

【Linux】進程終止與進程等待

目錄 進程終止 errno exit和_exit 進程等待 wait和waitpid 宏:WIFEXITED 非阻塞等待 進程終止 下面要談的一個話題就是進程終止,就是說一個進程退出了,可能有三種情況 1.進程代碼執行完,結果是正確的 2.進程代碼執行完&…

【九十二】【算法分析與設計】875. 愛吃香蕉的珂珂,410. 分割數組的最大值,機器人跳躍問題,二分答案法

875. 愛吃香蕉的珂珂 - 力扣(LeetCode) 珂珂喜歡吃香蕉。這里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警衛已經離開了,將在 h 小時后回來。 珂珂可以決定她吃香蕉的速度 k (單位:根/小時)。每…

【活動】開源與閉源大模型:探索未來趨勢的雙軌道路

🌈個人主頁: 鑫寶Code 🔥熱門專欄: 閑話雜談| 炫酷HTML | JavaScript基礎 ?💫個人格言: "如無必要,勿增實體" 文章目錄 開源與閉源大模型:探索未來趨勢的雙軌道路引言一、開源大模型&#…

翻譯《The Old New Thing》- The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag

The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071128-00/?p24353 Raymond Chen 2007年11月28日 FORMAT_MESSAGE_IGNORE_INSERTS 標志的重要性 簡要 文章討論了使用FormatMes…

評估企業的業務是否存在高風險的六個步驟

風險的幽靈使得組織別無選擇,只能改善各種網絡風險的總體管理。以下是一個基于信息安全論壇的IRAM2方法論的分步過程,網絡安全和風險從業者可以利用它來評估和管理信息風險。 第1步:范圍界定練習 范圍界定練習的目標是提供一個以業務為中心…

基于springboot+vue的招聘信息管理系統

開發語言:Java框架:springbootJDK版本:JDK1.8服務器:tomcat7數據庫:mysql 5.7(一定要5.7版本)數據庫工具:Navicat11開發軟件:eclipse/myeclipse/ideaMaven包:…

K8s的常用命令以及yaml文件的創建

目錄 一、聲明式管理方法:YAML文件 1、yaml文件簡介 2、yaml和json的主要區別: 3、YAML的語法格式 4、yaml文件組成部分 ①控制器定義 5、查看api資源版本標簽 6、編寫nginx-deployment.yaml資源配置清單 6.1創建資源對象 6.2查看創建的pod資源…