悲觀鎖樂觀鎖與事務注解在項目實戰中的應用場景及詳細解析

在今天做的項目練習部分中真的學到了很多東西,也補充了許多之前遺漏或是忘記的知識點,但時間精力有限,我就先記錄一下今天用到的一個新東西,悲觀鎖和樂觀鎖。

首先給出實際應用背景:

在加入鎖和事務注解之前,這里有著很明顯的并發問題,如果沒有紅圈中的部分,會出現以下情況

沒有鎖導致:

①多個用戶快速點擊,僅剩1張優惠券,卻多個用戶都搶到了優惠券(即user_coupon中新增了多條記錄)!!!

沒有事務導致:

①假設在if(i==0)代碼塊中拋出了異常,但由于沒有加入事務注解,因此無法回退,導致了“更新coupon表中的相關數據”這一步造成的影響無法恢復!!!

而加入了悲觀鎖和事務注解以后就很好的解決了這些并發問題!

=========================================================================

其次這里的使用還有許多細節,eg:

①鎖對象用到的是user.toString().intern() 而不是 user.toString()

? ?(這一點牽扯到了spring的動態代理,我會在明天的博客中解釋并把鏈接粘過來)

②鎖和事務的順序:上鎖——>事務開啟——>事務上交——>開鎖

? ?(這一點屬于事務邊界和鎖邊界問題,同樣的,明天補充)

接下來是我用到的一個樂觀鎖(嚴格來講它屬于數據庫層面的樂觀鎖機制):

從圖中的紅圈部分可以看出,它為了避免這一種高并發情況:

①假設有2個用戶都通過了之前的層層校驗來到了這里,但實際上這里只能再新增1條數據,如果沒有紅圈中的條件,就會導致增加了2條數據(即issue_num>=total_num),而這并不符合業務邏輯

有了紅圈中的類似于樂觀鎖思想的條件,再進行一次對數據的判斷,可以有效解決并發問題!

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

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

相關文章

Java構造器與工廠模式(靜態工程方法)詳解

1. 構造器1.1 構造器的核心意義1.1.1 對象初始化構造器在創建對象 (new) 時自動調用, 用于初始化對象的狀態 (如設置字段初始值, 分配資源等)無構造器時: 字段為默認值(0/null/false)有構造器:確保對象創建后即處于有效狀態1.1.2 強制初始化…

解決jdk初始化運行,防火墻通信選錯專業網絡問題

問題描述新項目添加不同版本的jdk,運行時提示防火墻通信策略,選成專用網絡。其他人訪問后端接口時,提示連接失敗。 解決方案:1、在搜索欄中輸入 防火墻關鍵字,選擇到防火墻和網絡保護2、選擇允許應用通過防火墻3、先點…

【Linux】常用命令(三)

【Linux】常用命令(三)1. export1.1 原理1.2 常用語法1.3 示例1.4 書中對命令的解釋1.5 生效范圍2. 測試服務地址與其端口能否訪問2.1 nc(Netcat)命令2.2 telnet2.3 nmap2.4 curl命令 (適用于HTTP/HTTPS 服務)1. export export 是 Linux Shell&#xff…

Pytest項目_day15(yaml)

YAMLYAML是一個對所有編程語言都很友好的數據序列化標準,它是一種直觀的能夠被電腦識別的數據序列化格式,是一種可讀性高且容易被人類閱讀的腳本語言YAML語言的本質是一種通用的數據串行化格式適用場景 可以直接序列化為數組、字典解析成本低專門寫配置文…

審批流程系統設計與實現:狀態驅動、靈活擴展的企業級解決方案

審批流程系統設計與實現:狀態驅動、靈活擴展的企業級解決方案 本文基于實際企業級審批系統源碼,深入解析如何設計高擴展性、強一致性的審批流程引擎,涵蓋狀態機設計、多租戶隔離、文件服務集成等核心實現。 1. 系統設計概覽 審批系統的核心架…

汽車免拆診斷案例 | 2010款奧迪A4L車行駛中發動機偶爾自動熄火

故障現象 一輛2010款奧迪A4L車,搭載CDZ發動機 ,累計行駛里程約為18.2萬km。該車行駛中發動機偶爾自動熄火,有時熄火后能夠立即重新起動著機,有時需要等待一會兒才能重新起動著機,故障頻率較低。因該故障在其他維修廠陸…

Liam ERD:自動生成美觀的交互式實體關系圖

Liam ERD 是一個可以快速生成美觀且具有交互性的數據庫實體關系圖(ERD)的工具,可以幫助用戶實現復雜數據庫結構的可視化。 Liam ERD 是一個免費開源的項目,代碼托管在 GitHub: https://github.com/liam-hq/liam 功能…

網絡協議序列化工具Protobuf

目錄前言一、下載注意二、解壓安裝三、Protobuf的使用1、創建.proto文件2、利用protoc編譯.proto文件前言 Protocol Buffers是Google的?種語??關、平臺?關、可擴展的序列化結構數據的?法,它可?于(數據)通信協議、數據存儲等。 Protoco…

從表單校驗到API網關:全鏈路輸入安全防護指南

從表單校驗到 API 網關:全鏈路輸入安全防護指南 在軟件系統的安全防御體系中,輸入安全是第一道防線,而這道防線的堅固程度直接決定了系統抵御外部攻擊的能力。從用戶在瀏覽器中填寫表單的那一刻起,到數據經過 API 網關流轉至后端服務,每一個環節都可能成為輸入攻擊的突破…

Flask vs Django:微框架與一站式對決

Flask 簡介 1、簡介 Flask誕生于2010年,是Armin ronacher用Python語言基于Werkzeug工具箱編寫的輕量級Web開發框架,又稱之為微框架。 "微"的含義:Flask旨在保持核心簡潔,本身相當于內核,其他功能需通過擴展…

真實業務場景:mysql慢查詢優化(從17秒的查詢優化到700毫秒)

慢查詢業務場景:原先在我們系統中要統計一些人員的單位 部門信息的數據情況,比如總的男女人數,每個單位下的男女人數等等,然后原來的sql是這樣寫的 根據一個單位的id 然后對一張表做出多個子查詢進行查詢,這時候統計記錄 由于加載…

遠程影音訪問:通過 cpolar 內網穿透服務使用 LibreTV

文章目錄前言【視頻教程】1.關于LibreTV2.docker部署LibreTV3.簡單使用LibreTV4.安裝cpolar內網穿透5.配置ward公網地址6.配置固定公網地址總結LibreTV 與 cpolar 的協同應用,為用戶打造了一條通往高清觀影自由的便捷之路。通過這一方案,用戶不僅擺脫了商…

Apache ECharts 6 核心技術解密 – Vue3企業級可視化實戰指南

簡介 ECharts 是百度開源的一個使用 JavaScript 實現的開源可視化庫,它能夠生動、可交互地展示數據。在 Vue3 項目中集成 ECharts 可以讓你的項目更加直觀和動態地呈現數據信息。 核心優勢 特性SVG渲染器Canvas渲染器縮放保真度★★★★★★★☆☆☆動態交互性能…

考公VS考研,拼哪個性價比高?

即將到來下半年,將迎來考公和考研是兩個非常重要的考試,也是許多年輕人為之奮斗的目標。無論是獲得一份穩定的“鐵飯碗”,還是提升學歷學位獲得更高的競爭力,都是值得努力的方向。那么,考公vs考研,到底哪個…

python2操作neo4j

環境依賴 jdk、neo4j圖數據庫 操作一條數據完整demo import os,json,sys,io from py2neo import Graph,Nodetry:sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)sys.stderr io.TextIOWrapper(sys.stderr.buffer, encodingutf-8) except Exception:passcla…

AI 編程實踐:用 Trae 快速開發 HTML 貪吃蛇游戲

1. 背景與目標 貪吃蛇是最適合入門的 2D 網頁小游戲之一:規則簡單、反饋清晰、可擴展空間大(穿墻模式、道具、多食物、排行榜……)。 demo地址:https://game.haiyong.site/snake-game.html 本項目的目標是: 純前端、…

FreeRTOS-C語言指針筆記

文章目錄一級指針指針基本概念指針使用示例代碼說明二、二級指針二級指針重點解析一級指針 C語言中的指針是一個非常重要的概念,它存儲了變量的內存地址。指針的使用可以使程序更加高效,尤其在處理數組、字符串和動態內存分配時。 指針基本概念 指針變…

界面布局智能建議生成:從功能需求到專業UI的AI加速之路

內容簡介: 傳統界面設計讓產品經理陷入"不懂設計、等設計師"的困境,效率低下還容易被挑刺。本文深度解析DeepSeek驅動的界面布局智能生成技術,通過DESIGN框架提示詞模板,讓產品經理在30分鐘內生成3種專業級界面方案,實現…

【BLE系列-第三篇】數據鏈路層(LL):廣播/連接/掃描流程詳解

目錄 引言 一、廣播及連接建立 1.1 廣播類型 1.2 掃描/連接請求與響應 1.2.1 廣播流程說明 1.2.1.1 廣播流程示例圖 1.2.1.2 廣播信息設置 1.2.1.3 信道廣播 1.2.1.4 信道切換 1.2.1.5 廣播間隔 1.2.1.6 接收窗口與理論最小傳輸時間 1.2.2 掃描/連接流程說明 1.2.…

JMeter 測試 WebSocket 接口的詳細教程

1. 安裝 WebSocket 插件 方法一:通過 Plugins Manager 下載并安裝 JMeter Plugins Manager在 JMeter 中:Options → Plugins Manager搜索 WebSocket 并安裝 方法二:手動安裝 下載 jmeter-websocket-samplers 插件將 jar 文件放到 JMeter/…