怎么在MySQL中利用DB實現分布式鎖

怎么在MySQL中利用DB實現分布式鎖?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

創新互聯建站2013年至今,是專業互聯網技術服務公司,擁有項目網站設計、做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元阜陽做網站,已為上家服務,為阜陽各地企業和個人服務,聯系電話:13518219792

表設計

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

清單1: 分布式鎖表結構

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

悲觀鎖實現

對于悲觀鎖業務中常見的操作有以下兩種:

怎么在MySQL中利用DB實現分布式鎖

針對A:

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

針對B:

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

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

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

樂觀鎖實現

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

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

看完上述內容,你們掌握怎么在MySQL中利用DB實現分布式鎖的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創新互聯行業資訊頻道,感謝各位的閱讀!

分享標題:怎么在MySQL中利用DB實現分布式鎖
標題路徑:http://m.kartarina.com/article48/phodhp.html

成都網站建設公司_創新互聯,為您提供域名注冊營銷型網站建設外貿網站建設商城網站企業建站虛擬主機

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

h5響應式網站建設
主站蜘蛛池模板: 蜜臀AV无码精品人妻色欲| 久久亚洲精品无码AV红樱桃| 无码H肉动漫在线观看| 亚洲AV永久青草无码精品| 国产日韩精品中文字无码| 丝袜无码一区二区三区| 色综合久久中文字幕无码| 亚洲精品无码av中文字幕| 日韩成人无码影院| 亚洲人成网亚洲欧洲无码久久| 亚洲AV无码日韩AV无码导航| 亚洲AV无码XXX麻豆艾秋| 免费无码作爱视频| 精品亚洲成在人线AV无码| 亚洲AV无码一区二区三区国产| 亚洲国产精品无码久久久蜜芽| 亚洲熟妇无码AV| 中文字幕乱码人妻无码久久| 无码国产精品一区二区免费| 久久中文精品无码中文字幕| 亚洲一区二区三区国产精品无码| 亚洲色偷拍区另类无码专区| 色综合AV综合无码综合网站 | 高清无码午夜福利在线观看| 亚洲无码精品浪潮| 无码Aⅴ在线观看| 精品无码一区在线观看| 中文字幕乱码人妻无码久久| 国语成本人片免费av无码| 韩日美无码精品无码| 特级无码a级毛片特黄| av潮喷大喷水系列无码| 无码人妻精品一区二区三区99仓本 | 亚洲精品无码久久久久秋霞 | 无码人妻精品一区二区三区夜夜嗨| 国产午夜无码片在线观看 | 免费人妻无码不卡中文字幕系| 中文字幕精品无码久久久久久3D日动漫 | 精品视频无码一区二区三区| 亚洲伊人成无码综合网| 韩国无码AV片在线观看网站|