成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么庫(kù)存扣減不需要加鎖?尤其是樂(lè)觀鎖?

開發(fā) 前端
沒(méi)加悲觀鎖是因?yàn)槊霘?chǎng)景不適合用悲觀鎖(為什么秒殺不能用悲觀鎖或者分布式鎖來(lái)實(shí)現(xiàn),詳見我的?面試寶典),那么為啥樂(lè)觀鎖都沒(méi)加呢?

在我的數(shù)藏項(xiàng)目中,庫(kù)存扣減的方法中(本文特指數(shù)據(jù)庫(kù)的扣減,不包含 Redis 層),我們?nèi)淌菦](méi)有加鎖的,甚至樂(lè)觀鎖都沒(méi)加。

沒(méi)加悲觀鎖是因?yàn)槊霘?chǎng)景不適合用悲觀鎖(為什么秒殺不能用悲觀鎖或者分布式鎖來(lái)實(shí)現(xiàn),詳見我的面試寶典),那么為啥樂(lè)觀鎖都沒(méi)加呢?這個(gè)是我們的庫(kù)存預(yù)扣減的 SQL:

圖片圖片

大家可以先忽略 SQL 中`/*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW 1 */`部分內(nèi)容,這是利用了阿里云 DMS 的 Inventory Hint 的機(jī)制抗高并發(fā)的實(shí)現(xiàn)。具體可以到我的項(xiàng)目課程中學(xué)習(xí)。

如上的 SQL 中,我們只做了數(shù)量的扣減,以及數(shù)量的上限的控制。但是沒(méi)有通過(guò) lock_version 做樂(lè)觀鎖的版本控制。

雖然我們用了MybatisPlus。也用到了他的@Version 注解,但是我們自己寫的 SQL 的這種方式,MyBatisPlus 也不會(huì)主動(dòng)幫我們加樂(lè)觀鎖的控制:

圖片圖片

那就是說(shuō)我們這里沒(méi)有做加鎖,為什么呢?

如果你知道樂(lè)觀鎖和悲觀鎖的區(qū)別,那么就會(huì)知道,樂(lè)觀鎖因?yàn)楸容^樂(lè)觀,所以一般是先做業(yè)務(wù)邏輯操作,比如參數(shù)處理,內(nèi)存中進(jìn)行模型組裝調(diào)整,然后再去更新數(shù)據(jù)庫(kù)。悲觀鎖因?yàn)楸容^悲觀,所以會(huì)先嘗試加鎖,然后再去做業(yè)務(wù)邏輯操作。

也就是說(shuō),樂(lè)觀鎖是先干活,后加鎖。悲觀鎖是先加鎖,再干活。樂(lè)觀鎖適合用在并發(fā)沖突不高的場(chǎng)景中。

而我們的這個(gè)庫(kù)存扣減這里,其實(shí)并發(fā)沖突還挺高的,如果這里用了樂(lè)觀鎖,那么就會(huì)有大量的失敗。

舉個(gè)例子,100個(gè)線程同時(shí)來(lái)查詢庫(kù)存,得到的 lock_version = 1,然后同時(shí)去更新庫(kù)存,都要求當(dāng)前的 lock_version = 1,這就會(huì)導(dǎo)致99個(gè)線程都失敗,那么就會(huì)導(dǎo)致整體失敗,如果事務(wù)中有其他操作,就要回滾。

庫(kù)存扣減的時(shí)候,我們的目的肯定是讓多個(gè)線程都扣減成功,并且不扣錯(cuò)就行了。

如果你的 SQL 是這樣的:

UPDATE collection


SET saleable_inventory = #{saleableInventory}


WHERE id = #{id}

也就是說(shuō)這個(gè)變更后的saleableInventory是你自己算好的,給到 SQL 去執(zhí)行的,那么就必須要加鎖來(lái)避免并發(fā)的時(shí)候計(jì)算出錯(cuò),但是我們通過(guò)在 SQL 中扣減不會(huì)有任何并發(fā)導(dǎo)致出錯(cuò)的問(wèn)題。

而如果這里不加樂(lè)觀鎖,只通過(guò)庫(kù)存扣減,以及庫(kù)存不能小于0來(lái)做控制,那么只需要他們各自搶鎖然后按順序扣減就行了,反正每次庫(kù)存都是在前面的結(jié)果上依次扣減的:

SET saleable_inventory = saleable_inventory - #{quantity}

所以,這里我們只需要保證不會(huì)超賣就行了,剩下的并發(fā)問(wèn)題 update 過(guò)程中的鎖會(huì)幫我們解決的。

本文的技術(shù)方案來(lái)自于我出的數(shù)藏項(xiàng)目實(shí)戰(zhàn)課,里面還有很多類似的干貨內(nèi)容。

責(zé)任編輯:武曉燕 來(lái)源: Hollis
相關(guān)推薦

2014-01-17 13:09:48

Linux碎片整理

2021-07-06 11:10:22

LinuxmacOSWindows

2021-05-07 15:18:26

比特幣禁令監(jiān)管

2019-07-15 08:00:00

AI人工智能

2012-06-12 09:46:21

Linux碎片整理

2020-05-07 10:09:30

MAC地址網(wǎng)絡(luò)協(xié)議網(wǎng)絡(luò)

2021-04-27 08:52:55

Linux MacOS碎片

2014-09-24 09:31:31

Dockersshd

2021-07-02 09:00:00

自動(dòng)駕駛特斯拉技術(shù)

2022-06-02 16:04:02

DeFi金融比特幣

2017-03-13 13:54:40

戴爾

2015-07-29 09:42:09

工程師全棧工程師

2022-03-22 13:39:10

框架react面試

2012-08-23 09:50:07

測(cè)試測(cè)試人員軟件測(cè)試

2009-11-23 12:45:22

2019-02-25 08:57:22

5G6G網(wǎng)絡(luò)

2015-09-30 09:57:53

天分熱情工程師

2015-08-20 10:56:19

算法界面開發(fā)

2013-12-02 09:43:29

字符串編程

2024-02-22 09:00:00

LogitMat數(shù)據(jù)集算法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 刘亦菲国产毛片bd | 久久精品黄色 | 欧美亚洲综合久久 | 成人免费视频网址 | 国产丝袜一区二区三区免费视频 | 黄网站在线观看 | 少妇一区在线观看 | 日韩欧美三区 | 国产91精品网站 | 日韩精品一区二区三区中文在线 | 成人免费观看男女羞羞视频 | 精品一二三区在线观看 | 一区二区在线观看免费视频 | 国产精品一级 | 日韩毛片中文字幕 | 在线色| 日韩一区二区在线观看视频 | 久久久久久亚洲 | 国产成人av一区二区三区 | av大片| 日韩视频区 | 狠狠操电影 | 欧美一级二级视频 | a级黄色网| 亚洲国产精选 | 日韩欧美国产一区二区三区 | 亚洲成人a v | 99热.com| 在线观看精品 | 成人免费观看男女羞羞视频 | 日韩国产一区二区三区 | 日韩成人免费视频 | 国产成人叼嘿视频在线观看 | 欧美日韩精品在线一区 | 欧美黄在线观看 | 午夜影视网| 欧美一区二区三区视频在线播放 | 男女羞羞视频在线看 | 精品亚洲一区二区三区 | 日本中文字幕视频 | 国产精品成人一区二区 |