「mybatis-plus」什麼是樂觀鎖?如何實現「樂觀鎖」

2020-12-27 計算機java編程

「樂觀鎖」這個詞以前我也沒聽過。上次在測試需求的時候,查詢資料庫發現有一個version欄位,於是請教開發這個字幹嘛使,人家回復我:樂觀鎖,解決並發更新用的。當時大家都忙,咱也不敢多問。

今天就來折騰一下「樂觀鎖」。

一、什麼是樂觀鎖

樂觀鎖其實用一句話來形容其作用就是:當要更新一條記錄的時候,希望這條記錄沒有被別人更新,從而實現線程安全的數據更新。

結合下場景,記得那是一張庫存表,有一個欄位記錄商品庫存,涉及多個地方都有可能去更新它:

程序A 查詢到了這條數據,得到庫存是800,準備+200更新成1000,但是還沒更新。程序B 也查詢到了這條數據,得到庫存是800,準備-200更新成600,並且提交更新了。那麼,這時候A再提交更新之後,B就會發現明明是自己是800-200=600,怎麼最後變成了1000?

這就是因為A的事務導致了B的數據更新丟失。

文字可能讀起來比較晦澀,有請靈魂畫手:

正常情況下:

按先後順序是, A先更新成1000,然後B再拿1000-200,更新成800,這樣B就沒異議了。或者實在要2個同時更新,那也只能有一個成功,這樣也沒異議。二、MP來實現樂觀鎖

樂觀鎖的實現,通過增加一個欄位,比如version,來記錄每次的更新。

查詢數據的時候帶出version的值,執行更新的時候,會再去比較version,如果不一致,就更新失敗。

還是用之前的user表,增加了新的欄位

version

1.在實體類裡增加對於的欄位,並且加上自動填充(你也可以每次手動填充)

2. 配置插件

為了便於管理,可以見一個包,用於存放各種配置類,順便把配置在啟動類裡的mapper掃描也換到這裡來。

3.測試樂觀鎖

先新增一條測試數據:

新增成功,可以看到version值是0。

再來試一下正常的修改:

修改成功,可以看到version 變成了1。

最後,模擬下並發更新,樂觀鎖更新失敗的情況:

按照樂觀鎖的原理,user2是可以更新成功的,也就是name會修改為「大周4」,version會加1。user因為前後拿到的版本號不對,更新失敗。

結果符合預期,我們也可以看下mybatis的日誌,進一步了解一下:

可以看到上面首先是2個查詢,查詢到的version都是1。

接著,第一個執行update語句的時候,where條件中version=1,可以找到數據,於是更新成功,切更新version=2。

而第二個再執行update的時候,where條件version=1,已經找不到了,因為version已經被上面的更新成了2,所以更新失敗。

相關焦點

  • 漫話:什麼是樂觀鎖與悲觀鎖
    在《如何給女朋友解釋什麼是並發和並行》一文中我們介紹過並發和並行。樂觀鎖( Optimistic Locking ) 是相對悲觀鎖而言的,樂觀鎖假設數據一般情況下不會造成衝突,所以在數據進行提交更新的時候,才會正式對數據的衝突與否進行檢測,如果發現衝突了,則讓返回用戶錯誤的信息,讓用戶決定如何去做
  • mybatis-plus 2.1.8-SNAPSHOT 發布,代號:翻車魚
    mybatis-plus 是一款 mybatis 動態 SQL 自動注入 mybatis 增刪改查 CURD 操作中間件。
  • 小學妹問:Mybatis常見註解有哪些?
    該註解是由Mybatis框架中定義的一個描述數據層接口的註解,註解往往起到的都是一個描述性作用,用於告訴Spring框架此接口的實現類由Mybatis負責創建,並將其實現類對象存儲到spring容器中。
  • MyBatis JPA Extra,MyBatis JPA 擴展 v2.2 發布
    MyBatis JPA ExtraMyBatis JPA Extra對MyBatis進行了JPA擴展,旨在基於JPA 2.1的注釋簡化對單表CUID操作,根據JPA注釋動態生成SQL語句;使用Interceptor實現資料庫
  • springboot+springsecurity實現前後端分離簡單實現!
    1、前言部分1.1、如何學習?看springsecurtiy原理圖的時候以為灑灑水,結果自己動手做的時候一竅不通,所以一定不要眼高手低,實踐出真知!1.2、技術支持jdk 1.8、springboot 2.3.4、mybatis-plus 3.4.1、mysql 5.5、springsecurity 5.3.4、springmvc、lombok簡化entity代碼,不用你去寫get、set方法,全部自動生成、gson 2.8.2 將json對象轉化成json字符串
  • 小提琴大師帕爾曼的「樂觀美食哲學」
    而在指揮樂團時,有時他也會跟樂團說:「聽起來不錯,但很像優格,優格很好,優格沒有不對…但,冰淇淋如何?比較油…」帕爾曼強調,聲音一定要有特性,但除了特性之外,更重要的是音色的多元性,如果擁有完美的音色但不善加予以變化,那肯定會很乏味。
  • 從0 開始手寫一個 Mybatis 框架,三步搞定!
    我們對上圖進行分析總結:1、mybatis的配置文件有2類mybatisconfig.xml,配置文件的名稱不是固定的,配置了全局的參數的配置,全局只能有一個配置文件。Mapper.xml 配置多個statemement,也就是多個sql,整個mybatis框架中可以有多個Mappe.xml配置文件。
  • 「原型設計」如何利用Axure實現下拉子菜單?
    本文介紹如何透過這款工具實現下拉子菜單功能的原型設計。在本次的下拉子菜單功能實現中,我們主要用到了動態面板(當然不用動態面板也能實現,只是效果和效率上沒有那麼好),動態面板是Axure中的一款高級組件,可以有效幫助我們實現隱藏/顯示、滑動、拖動、狀態切換等效果。
  • 日語中的「鍵」為什麼既能表示「鑰匙」也能表示「鎖」?
    我們知道,日語中的「鍵(かぎ)」表示「鑰匙」的意思,例如:(1)玄関(げんかん)の鍵をなくした。房門鑰匙弄丟了。但同時還能表示「鎖」的意思。例如:(2)納戸(なんど)に鍵をつけた。給儲物間上了一把鎖。除此之外,「鍵」還有「關鍵」的意思,表示最緊要的部分或起決定性作用的因素。
  • 從原版的「手術刀」到中國版的「撫慰劑」,《來電狂響》是如何完成「本土化」改編的?
    如何在原有的堪稱經典的故事構架、密閉空間、遊戲規則和人物關係的「限制」內進行二度創作,可以讓故事更加符合當下中國觀眾的觀影需求,並且在「本土化」的過程裡平衡喜劇和作者表達的雙重目標,又能相對客觀地體現社會多個階層面臨的現實,是擺在改編者面前的難題。
  • 拆解報告:233621 Wave plus頸掛藍牙耳機
    二、233621 Wave plus 耳機拆解 我愛音頻網總結 233621 Wave plus頸掛藍牙耳機在外觀上採用了符合人體工學的設計,搭配親膚材質,佩戴舒適;U型記憶項圈可實現隨意彎曲,提升便攜性。耳機機身上設計同樣親膚的矽膠耳套,增加佩戴的貼合度,提升佩戴穩固度。超聲波焊接工藝保證IPX5 級防水, 兼顧日常使用和運動。
  • 日本女生的「透明肌」,如何養成?
    「透明肌」真讓人心動啊Aloha,大家好,愛琢磨的阿歪又來啦。開篇前,阿歪想問大家一個問題:同樣指代亮白清透,如何理解韓系的「水光肌」和日系的「透明肌」?不知大家如何理解,阿歪認為「水光肌」更突出肌膚的光澤度,「透明肌」看重的是內外兼顧的整體。論造詣,還是「透明肌」技高一籌。
  • 【3DS】《逆轉裁判6》公開由成步堂和王尼喜介紹「心理鎖」系統的介紹影片
    CAPCOM 於日前公開了預定 6 月 9 日發售的 Nintendo 3DS 專用軟體《逆轉裁判 6》的遊戲系統「心理鎖」之概要。心理鎖是在追問對手秘密或是隱瞞的問題時,可以問出全新真相的系統。在同公司設立的 YouTube 頻道當中,還公開了以此系統為主題的「Nintendo 3DS《逆轉裁判 6》原來如此!靈媒幻視講座 基本篇」介紹影片。
  • 「蘋果小技巧」你造麼,蘋果的備忘錄是可以加鎖的!
    今天「Tech喵」就分享系統自帶的「備忘錄」 app,是如何滿足你保密需求的!如何實現加鎖呢?
  • 如何讓手機屏幕「上電視」?你需要了解的投屏協議
    今天我們就聊一聊生活中隨處可見的智能電視和電視盒子背後的「秘密」。 佔領了智能電視的「無線大佬」話說,當今無線投屏界,天下三分,烽煙四起…它們的使命都是相同的——擺脫轉接線,讓設備與顯示屏之間「自由戀愛」。所以各家之間的本事不分伯仲:音頻,圖片,視頻,你的設備能「放」什麼,它們就能傳什麼到顯示器或者音響上去。
  • 「爆紅女星」永野芽鬱生命倒數 北村匠海催淚幫實現願望
    記者吳睿慈/綜合報導日本電影《你在月夜裡閃耀光輝》改編自第23屆「電擊小說大賞」得獎作品,並由《我想吃掉你的胰臟》導演月川翔編寫劇本翻拍,女主角找來「爆紅女星」永野芽鬱擔綱,飾演患有不治之症的女高中生飾演「真水」,當生命進入倒數,她演出角色的樂觀積極,另一方面卻讓觀眾不舍,眼淚直直落的哭戲逼出在場的導演
  • Spring Boot與Shiro整合實現用戶認證
    實現用戶認證(登錄)操作1.4.1. 設計登錄頁面<!整合MyBatis實現登錄1.5.1. 導入mybatis相關的依賴<!-- SpringBoot的Mybatis啟動器 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId
  • 臺劇《預支未來》,欲望都能實現的「未來商城」,你會買什麼?
    2013年賴俊羽導演推出處女作,由陳柏霖、陳意涵主演的喜劇《愛情無全順》,當時「大仁哥」陳柏霖顛覆形象,演出不修邊幅的宅男loser,加上女神陳意涵的吸睛能力,引起不小話題。他深入調查後,發覺這些案件的共同點:都與一個神秘的線上購物網站「未來商城」有關,購買人只要通過平板、手機、電腦,就可以從網站買到名譽、親情、友情,甚至美貌,穿越至未來時空,獲取想要的東西,但這些無法滿足的「欲望」,最終卻只引發一場場無可挽回的悲劇。
  • MyBatis動態SQL(認真看看, 以後寫SQL就爽多了)
    目前, 動態 SQL 支持以下幾種標籤:1 數據準備為了後面的演示, 創建了一個 Maven 項目 mybatis-dynamic, 創建了對應的資料庫和表DROP TABLE IF EXISTS `student`;CREATE TABLE `student` (  `student_id` int(10) unsigned NOT
  • 專訪| re:plus:純粹的旋律Prayer新專輯巡演
    這次在中國開展的出道十周年&新專輯巡演,所經歷的城市中不僅有上海和北京,還有長沙和南京兩站,又增加了廣州、深圳、杭州、成都、武漢共計9個城市,創造了re:plus超越以往的巡演規模。由於re:plus上一張專輯的目標是現場演奏形式和編程音樂的融合,演出之後,re:plus自己覺得很成功,然而與之相反的是聽眾的反應很一般。