最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL借助DB實現(xiàn)分布式鎖思路詳解

 更新時間:2019年10月09日 08:33:01   作者:屈定  
這篇文章主要給大家介紹了關(guān)于MySQL借助DB實現(xiàn)分布式鎖思路的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

無論是單機(jī)鎖還是分布式鎖,原理都是基于共享的數(shù)據(jù),判斷當(dāng)前操作的行為。對于單機(jī)則是共享RAM內(nèi)存,對于集群則可以借助Redis,ZK,DB等第三方組件來實現(xiàn)。Redis,ZK對分布式鎖提供了很好的支持,基本上開箱即用,然而這些組件本身要高可用,系統(tǒng)也需要強依賴這些組件,額外增加了不少成本。DB對于系統(tǒng)來說本身就默認(rèn)為高可用組件,針對一些低頻的業(yè)務(wù)使用DB實現(xiàn)分布式鎖也是一個不錯的解決方案,比如控制多機(jī)器下定時任務(wù)的起調(diào),針對審批回調(diào)處理等,本文將給出DB實現(xiàn)分布式鎖的一些場景以及解決方案,希望對你啟發(fā)。

表設(shè)計

首先要明確DB在系統(tǒng)中仍然需要認(rèn)為是最脆弱的一環(huán),因此在設(shè)計時需要考慮壓力問題,即能應(yīng)用實現(xiàn)的邏輯就不要放到DB上實現(xiàn),也就是盡量少使用DB提供的鎖能力,如果是高并發(fā)業(yè)務(wù)則要避免使用DB鎖,換成Redis等緩存鎖更加有效。如清單1所示,該表中唯一的約束為lock_name,timestamp,version三者組合主鍵,下文會利用這三者實現(xiàn)悲觀鎖,樂觀鎖等業(yè)務(wù)場景。

清單1: 分布式鎖表結(jié)構(gòu)

CREATE TABLE `lock` (
`lock_name` varchar(32) NOT NULL DEFAULT '' COMMENT '鎖名稱',
`resource` bigint(20) NOT NULL COMMENT '業(yè)務(wù)主鍵',
`version` int(5) NOT NULL COMMENT '版本',
`gmt_create` datetime NOT NULL COMMENT '生成時間',
PRIMARY KEY (`lock_name`,`resource`,`version`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

悲觀鎖實現(xiàn)

對于悲觀鎖業(yè)務(wù)中常見的操作有以下兩種:


針對A:

A場景當(dāng)一臺機(jī)器獲取到鎖后,其他機(jī)器處于排隊狀態(tài),鎖釋放后其他機(jī)器才能夠繼續(xù)下去,這種應(yīng)用層面解決是相當(dāng)麻煩,因此一般使用DB提供的行鎖能力,即select xxx from xxx for update。A場景一般都和業(yè)務(wù)強關(guān)聯(lián),比如庫存增減,使用業(yè)務(wù)對象作為行鎖即可。需要注意的是,該方案本質(zhì)上鎖壓力還是在數(shù)據(jù)庫上,當(dāng)阻塞住的線程過多,且操作耗時,最后會出現(xiàn)大量鎖超時現(xiàn)象。

針對B:

針對B場景(tryLock)舉個具體業(yè)務(wù),在集群下每臺機(jī)器都有定時任務(wù),但是業(yè)務(wù)上要求同一時刻只能有一臺能正常調(diào)度。
解決思路是利用唯一主鍵約束,插入一條針對TaskA的記錄,版本則默認(rèn)為1,插入成功的算獲取到鎖,繼續(xù)執(zhí)行業(yè)務(wù)操作。這種方案當(dāng)機(jī)器掛掉就會出現(xiàn)死鎖,因此還需要有一個定時任務(wù),定時清理已經(jīng)過期的鎖,清理維度可以根據(jù)lock_name設(shè)置不同時間清理策略。

定時任務(wù)清理策略會額外帶來復(fù)雜度,假設(shè)機(jī)器A獲取到了鎖,但由于CPU資源緊張,導(dǎo)致處理變慢,此時鎖被定時任務(wù)釋放,因此機(jī)器B也會獲取到鎖,那么此時就出現(xiàn)同一時刻兩臺機(jī)器同時持有鎖的現(xiàn)象,解決思路:把超時時間設(shè)置為遠(yuǎn)大于業(yè)務(wù)處理時間,或者增加版本機(jī)制改成樂觀鎖。

insert into lock set lock_name='TaskA' , resource='鎖住的業(yè)務(wù)',version=1,gmt_create=now()
success: 獲取到鎖
failed:放棄操作
釋放鎖

樂觀鎖實現(xiàn)

針對樂觀鎖場景,舉個具體業(yè)務(wù),在后臺系統(tǒng)中經(jīng)常使用大json擴(kuò)展字段存儲業(yè)務(wù)屬性,在涉及部分更新時,需要先查詢出來,合并數(shù)據(jù),寫入到DB,這個過程中如果存在并發(fā),則很容易造成數(shù)據(jù)丟失,因此需要使用鎖來保證數(shù)據(jù)一致性,相應(yīng)操作如下所示,針對樂觀鎖,不存在死鎖,因此這里直接存放業(yè)務(wù)id字段,保證每一個業(yè)務(wù)id有一條對應(yīng)的記錄,并且不需要對應(yīng)的定時器清除。

select * from lock where lock_name='業(yè)務(wù)名稱', resource='業(yè)務(wù)id';
不存在: insert into lock set lock_name='業(yè)務(wù)名稱', resource='業(yè)務(wù)id' , version=1;
獲取版本: version
業(yè)務(wù)操作: 取數(shù)據(jù),合并數(shù)據(jù),寫回數(shù)據(jù)
寫回到DB: update lock set version=version+1 where lock_name='業(yè)務(wù)名稱' and resource='業(yè)務(wù)id' and version= #{version};
寫回成功: 操作成功
寫回失敗: 回滾事務(wù),從頭操作

樂觀鎖寫入失敗會回滾整個事務(wù),因此如果寫入沖突很頻繁的場景不適合使用樂觀鎖,大量的事務(wù)回滾會給DB巨大壓力,最終影響到具體業(yè)務(wù)系統(tǒng)。

總結(jié)

分布式鎖的原理實際上很容易理解,難的是如何在具體業(yè)務(wù)場景上選擇最合適的方案。無論是哪一種鎖方案都是與業(yè)務(wù)密切關(guān)聯(lián),總之沒有完美的分布式鎖方案,只有最適合當(dāng)前業(yè)務(wù)的鎖方案。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • MySQL8.x msi版安裝教程圖文詳解

    MySQL8.x msi版安裝教程圖文詳解

    這篇文章主要介紹了MySQL8.x msi版安裝教程 ,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05
  • 圖文并茂地講解Mysql索引(index)

    圖文并茂地講解Mysql索引(index)

    在關(guān)系數(shù)據(jù)庫中,索引是一種單獨的、物理的數(shù)對數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種存儲結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于Mysql索引(index)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • MySQL視圖的概念、創(chuàng)建、查看、刪除和修改詳解

    MySQL視圖的概念、創(chuàng)建、查看、刪除和修改詳解

    視圖是指計算機(jī)數(shù)據(jù)庫中的視圖,是一個虛擬表,其內(nèi)容由查詢定義,下面這篇文章主要給大家介紹了關(guān)于MySQL視圖的概念、創(chuàng)建、查看、刪除和修改的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 使用MySQL設(shè)置遠(yuǎn)程數(shù)據(jù)庫以優(yōu)化網(wǎng)站性能的操作步驟

    使用MySQL設(shè)置遠(yuǎn)程數(shù)據(jù)庫以優(yōu)化網(wǎng)站性能的操作步驟

    隨著您的應(yīng)用程序或網(wǎng)站的增長,您可能會發(fā)現(xiàn)已經(jīng)超出了當(dāng)前的設(shè)置,如果您目前將 Web 服務(wù)器和數(shù)據(jù)庫后端托管在同一臺 VPS 上,一個好主意是將這兩個功能分開,以便每個功能可以在自己的機(jī)器上運行和增長,在本指南中,我們將討論如何配置一個遠(yuǎn)程數(shù)據(jù)庫服務(wù)器
    2024-11-11
  • Mysql my.cnf配置文件參數(shù)詳解

    Mysql my.cnf配置文件參數(shù)詳解

    Linux 操作系統(tǒng)中 MySQL 的配置文件是 my.cnf,一般會放在 /etc/my.cnf 或 /etc/mysql/my.cnf 目錄下,這篇文章主要介紹了Mysql my.cnf配置文件參數(shù)詳解,需要的朋友可以參考下
    2023-11-11
  • MySQL中is?null和=null的區(qū)別及說明

    MySQL中is?null和=null的區(qū)別及說明

    這篇文章主要介紹了MySQL中is?null和=null的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Windows下實現(xiàn)MySQL自動備份的批處理(復(fù)制目錄或mysqldump備份)

    Windows下實現(xiàn)MySQL自動備份的批處理(復(fù)制目錄或mysqldump備份)

    Windows下實現(xiàn)MySQL自動備份的批處理,新建目錄并復(fù)制壓縮,結(jié)合windows計劃任務(wù)方便實現(xiàn)每天的自動備份
    2012-05-05
  • MySQL備份恢復(fù)最佳實踐指北

    MySQL備份恢復(fù)最佳實踐指北

    這篇文章主要介紹了MySQL備份恢復(fù)最佳實踐的終極指南詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • MySQL如何添加環(huán)境變量和初始化MySQL

    MySQL如何添加環(huán)境變量和初始化MySQL

    本文主要介紹了如何在Windows系統(tǒng)中添加MySQL的環(huán)境變量以及如何初始化MySQL,通過添加環(huán)境變量,可以在任意一個命令提示符中直接調(diào)用MySQL的相關(guān)程序,大大簡化了操作,初始化MySQL時,需要新建一個配置文件并指定默認(rèn)編碼集和存儲引擎,如果初始化過程中出現(xiàn)錯誤
    2024-11-11
  • 一文介紹mysql中TINYINT取值范圍

    一文介紹mysql中TINYINT取值范圍

    本文主要介紹了mysql中TINYINT取值范圍,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評論

南投县| 哈尔滨市| 嘉荫县| 阿克苏市| 潜江市| 电白县| 桦川县| 二连浩特市| 烟台市| 庆云县| 揭阳市| 五家渠市| 冷水江市| 富裕县| 大冶市| 石渠县| 嘉义市| 郧西县| 忻城县| 博兴县| 宿州市| 金沙县| 蓝田县| 贵南县| 汝南县| 社会| 徐汇区| 定安县| 招远市| 三原县| 尖扎县| 长治市| 长岭县| 江北区| 平昌县| 南陵县| 南通市| 莱芜市| 霍林郭勒市| 信阳市| 苍山县|