分布式鎖之基于mysql實現分布式鎖(四)

????????不管是jvm鎖還是mysql鎖,為了保證線程的并發安全,都提供了悲觀獨占排他鎖。所以獨占排他也是分布式鎖的基本要求。

可以利用唯一鍵索引不能重復插入的特點實現。設計表如下:

CREATE TABLE `tb_lock` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`lock_name` varchar(50) NOT NULL COMMENT '鎖名',`class_name` varchar(100) DEFAULT NULL COMMENT '類名',`method_name` varchar(50) DEFAULT NULL COMMENT '方法名',`server_name` varchar(50) DEFAULT NULL COMMENT '服務器ip',`thread_name` varchar(50) DEFAULT NULL COMMENT '線程名',`create_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '獲取鎖時間',`desc` varchar(100) DEFAULT NULL COMMENT '描述',PRIMARY KEY (`id`),UNIQUE KEY `idx_unique` (`lock_name`)
) ENGINE=InnoDB AUTO_INCREMENT=1332899824461455363 DEFAULT CHARSET=utf8;

Lock實體類:

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("tb_lock")
public class Lock {private Long id;private String lockName;private String className;private String methodName;private String serverName;private String threadName;private Date createTime;private String desc;
}

LockMapper接口:

public interface LockMapper extends BaseMapper<Lock> {
}

4.1. 基本思路

????????synchronized關鍵字和ReetrantLock鎖都是獨占排他鎖,即多個線程爭搶一個資源時,同一時刻只有一個線程可以搶占該資源,其他線程只能阻塞等待,直到占有資源的線程釋放該資源。

  1. 線程同時獲取鎖(insert)

  2. 獲取成功,執行業務邏輯,執行完成釋放鎖(delete)

  3. 其他線程等待重試

4.2. 代碼實現

改造StockService:

@Service
public class StockService {@Autowiredprivate StockMapper stockMapper;@Autowiredprivate LockMapper lockMapper;/*** 數據庫分布式鎖*/public void checkAndLock() {// 加鎖Lock lock = new Lock(null, "lock", this.getClass().getName(), new Date(), null);try {this.lockMapper.insert(lock);} catch (Exception ex) {// 獲取鎖失敗,則重試try {Thread.sleep(50);this.checkAndLock();} catch (InterruptedException e) {e.printStackTrace();}}// 先查詢庫存是否充足Stock stock = this.stockMapper.selectById(1L);// 再減庫存if (stock != null && stock.getCount() > 0){stock.setCount(stock.getCount() - 1);this.stockMapper.updateById(stock);}// 釋放鎖this.lockMapper.deleteById(lock.getId());}
}

加鎖:

// 加鎖
Lock lock = new Lock(null, "lock", this.getClass().getName(), new Date(), null);
try {this.lockMapper.insert(lock);
} catch (Exception ex) {// 獲取鎖失敗,則重試try {Thread.sleep(50);this.checkAndLock();} catch (InterruptedException e) {e.printStackTrace();}
}

解鎖:

// 釋放鎖
this.lockMapper.deleteById(lock.getId());

使用Jmeter壓力測試結果:

可以看到性能感人。mysql數據庫庫存余量為0,可以保證線程安全。

4.3. 缺陷及解決方案

缺點

  1. 這把鎖強依賴數據庫的可用性,數據庫是一個單點,一旦數據庫掛掉,會導致業務系統不可用。

    解決方案:給 鎖數據庫 搭建主備

  2. 這把鎖沒有失效時間,一旦解鎖操作失敗,就會導致鎖記錄一直在數據庫中,其他線程無法再獲得到鎖。

    解決方案:只要做一個定時任務,每隔一定時間把數據庫中的超時數據清理一遍。

  3. 這把鎖是非重入的,同一個線程在沒有釋放鎖之前無法再次獲得該鎖。因為數據中數據已經存在了。

    解決方案:記錄獲取鎖的主機信息和線程信息,如果相同線程要獲取鎖,直接重入。

  4. 受制于數據庫性能,并發能力有限。

    解決方案:無法解決。

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

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

相關文章

(二)C語言之變量與算數運算表達式概述

C語言之變量與算數運算表達式概述 一、華氏溫度與攝氏溫度對照二、代碼概述三、練習 一、華氏溫度與攝氏溫度對照 #include <stdio.h>/*當華氏溫度為 0,20,40,...300時&#xff0c;打印出華氏溫度與攝氏溫度對照表華氏溫度與攝氏溫度 C(5/9)(?F-32) 其中C表示攝氏溫度&…

順序棧和鏈棧

#include<iostream> using namespace std; #define MAXSIZE 100 typedef int SElemType; typedef struct { SElemType* base; SElemType* top; int stacksize; }SqStack;//順序棧 //構造一個空棧 int InitStack(SqStack& s) { s.base new SElemType…

Django之中間件與CSRF_TOKEN

文章目錄 一、什么是中間件二、中間件有什么用三、Django自定義中間件中間件中主要方法及作用創建自定義中間件的步驟&#xff1a;process_request與process_response方法process_view方法process_exceptionprocess_template_response&#xff08;不常用&#xff09; 四、CSRF_…

mysql latin-1報錯解決

conn pymysql.connect(hostmeta_conf[host], usermeta_conf[user], passwordmeta_conf[password], portmeta_conf[port], charsetutf8) 光把表聲明 ENGINEINNODB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_bin ROW_FORMATDYNAMIC 并不能解決這個報錯,需要在創建mysql連接時候…

面試:RabbitMQ相關問題

文章目錄 簡單介紹RabbitMQRabbitMQ架構什么是 RabbitMQ&#xff1f;有什么顯著的特點&#xff1f;RabbitMQ 有那些基本概念&#xff1f;RabbitMQ routing 路由模式消息怎么路由&#xff1f;RabbitMQ publish/subscribe 發布訂閱(共享資源)能夠在地理上分開的不同數據中心使用 …

vue2指令的使用和自定義指令

前言 個人認為vue的指令,對比react來說,給開發者節省了很大的學習成本。比如在react中,你想渲染一個列表,需要用Array.map的方法return<div>,而在vue中,一個簡單的v-for就解決了問題。 在學習成本和入手體驗上,vue的作者確實后來者居上,能讓人更快的使用vue開發。不過也…

無邊界電視點播TVbox殼+源

TBBox可以是個盒子也可以是軟件 視頻播放的困局新的改變TVBox apk更成熟的熊貓寶盒_3.10還有這個沒測試恒星TV 寫在最后 視頻播放的困局 現在電視上幾大平臺看劇集都要充會員&#xff0c;而電腦上網頁端有很多可以看的網頁&#xff0c;只有 隨便一搜就測出來&#xff0c;只是經…

數據安全第一:應對[[MyFile@waifu.club]].wis勒索病毒的實用建議與技巧

引言&#xff1a; 在當今數字化時代&#xff0c;[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis勒索病毒是一種惡意軟件&#xff0c;其危害用戶數據安全&#xff0c;通過加密文件并勒索贖金來獲取經濟利益。以下是對[[MyFilewaifu.club]].wis、[[backupwaifu.club]].wis…

PyTorch包

進入PyTorch的官網&#xff1a; pytorch GitHub 點擊GitHub&#xff1a; 進入PyTorch的主目錄&#xff1a; 進入Vision reference&#xff1a; detection&#xff1a; 這就是我們在訓練過程中會使用到的文件了&#xff1a;

objdump反匯編文件解析

命令使用 objdump可以對可執行文件進行反匯編 其常用參數為: objdump -d <file(s)>: 將代碼段反匯編&#xff1b;objdump -S <file(s)>: 將代碼段反匯編的同時&#xff0c;將反匯編代碼與源代碼交替顯示&#xff0c;編譯時需要使用-g參數&#xff0c;即需要調試信…

Hadoop技術與應用的習題

第一章測驗 1、下面哪個選項不屬于Google的三駕馬車&#xff1f; A.HDFS B.MapReduce C.BigTable D.GFS 2、下面哪個思想是為了解決PageRank&#xff08;網頁排名&#xff09;的問題&#xff1f; A.GFS B.BigTable C.MapReduce D.YARN 3、GFS 存儲的文件都被分割成固定大小的…

CAN基礎知識

CAN 簡介 CAN 是 Controller Area Network 的縮寫&#xff08;以下稱為 CAN&#xff09;&#xff0c;是 ISO 國際標準化的串行通信 協議。在當前的汽車產業中&#xff0c;出于對安全性、舒適性、方便性、低公害、低成本的要求&#xff0c;各種 各樣的電子控制系統被開發了出來…

簡單的用Python采集股票數據,保存表格后分析歷史數據

前言 字節跳動如果上市&#xff0c;那么鐘老板將成為我國第一個世界首富 趁著現在還沒上市&#xff0c;咱們提前學習一下用Python分析股票歷史數據&#xff0c;抱住粗大腿坐等起飛~ 好了話不多說&#xff0c;我們直接開始正文 準備工作 環境使用 Python 3.10 解釋器Pychar…

如何應用ChatGPT撰寫、修改論文及工作報告,提供寫作能力及優化工作??

如果我想讓gpt從pdf文檔中提取相關關鍵詞的內容&#xff0c;可以怎么做呢&#xff1f;&#xff1f;我們評論區討論 ChatGPT 在論文寫作與編程方面也具備強大的能力。無論是進行代碼生成、錯誤調試還是解決編程難題&#xff0c;ChatGPT都能為您提供實用且高質量的建議和指導&am…

愛上C語言:scanf、gets以及getchar輸入字符串你真的懂了嗎

&#x1f680; 作者&#xff1a;阿輝不一般 &#x1f680; 你說呢&#xff1a;不服輸的你&#xff0c;他們拿什么贏 &#x1f680; 專欄&#xff1a;愛上C語言 &#x1f680;作圖工具&#xff1a;draw.io(免費開源的作圖網站) 如果覺得文章對你有幫助的話&#xff0c;還請點贊…

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示

通過ros系統中websocket中發送sensor_msgs::Image數據給web端顯示 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchronizer.h> #include &…

spring 是如何開啟事務的, 核心原理是什么

文章目錄 spring 是如何開啟事務的核心原理1 基于注解開啟事務2 基于代碼來開啟事務 spring 是如何開啟事務的 核心原理 Spring事務管理的實現有許多細節&#xff0c;如果對整個接口框架有個大體了解會非常有利于我們理解事務&#xff0c;下面通過講解Spring的事務接口來了解…

建行廣東省江門市分行走進農村地區開展反假貨幣宣傳

人民對美好生活的向往&#xff0c;涉及方方面面&#xff0c;小至“錢袋子”安全。建行廣東省江門市分行落實當地監管部門部署&#xff0c;積極扛起維護國家金融安全的重要政治責任&#xff0c;深入農村地區開展反假貨幣宣傳工作&#xff0c;助力構建農村反假貨幣工作長效機制。…

Hyper-V系列:windows11開啟系統自帶安卓虛擬機并安裝apk包

本文記錄了Windows11系統下開啟系統自帶的安卓虛擬機,并通過安裝包安裝自定義應用的過程。開啟系統自帶的安卓虛擬機流程為:開啟Hyper-V、安裝Windows11子系統;安裝apk安裝包的流程為:安裝adb調試工具、開啟子系統的開發者模式、安裝apk應用包。 一. 開啟Hyper-V Hyper-V…

[BJDCTF2020]The mystery of ip1

提示 ssti模板注入head頭x-forwarded-for 每一次做題的最開始流程都大致因該是 信息收集找可以操控的地方 查看hint頁面的源代碼又發現它提示說 ####你知道為什么會知道你的ip嗎 查看flag頁面 從剛才給我的提示以及他這里顯示的我的ip&#xff0c;大概找到了我可操作的可控點 …