樂(lè)觀鎖解決并發(fā)問(wèn)題

業(yè)務(wù)場(chǎng)景

一般的商城業(yè)務(wù)中,我們經(jīng)常會(huì)遇到一種場(chǎng)景,某商品庫(kù)存只剩最后一件,但此時(shí)有多個(gè)用戶(hù)同時(shí)下單,如果沒(méi)有做任何的處理,多個(gè)用戶(hù)下單時(shí)進(jìn)程讀取到的庫(kù)存為1,程序判斷符合扣庫(kù)存條件,下單成功,就會(huì)造成庫(kù)存變成負(fù)數(shù)的情況

解決方案

思路

樂(lè)觀鎖通過(guò)增加一個(gè)每次更新庫(kù)存都會(huì)自增的version字段來(lái)解決這個(gè)問(wèn)題,每個(gè)進(jìn)程讀取庫(kù)存字段的同時(shí),也會(huì)讀取version的值,在更新庫(kù)存同時(shí)更新version,并增加對(duì)version字段值的判斷

代碼實(shí)現(xiàn)
<!-- 樂(lè)觀鎖更新庫(kù)存 -->
<update id="newMinStock" parameterType="java.util.Map">
    update goods
    set stock= stock - 1,version = #{version} + 1
    where id  = #{id} and version = #{version}
</update>

假設(shè)有兩個(gè)進(jìn)程都讀取到了stock的值為1,version默認(rèn)值為0,則這兩個(gè)進(jìn)程執(zhí)行的更新語(yǔ)句都是update goods set stock=stock-1,version=version+1 where id=1 and version=0,當(dāng)其中一個(gè)進(jìn)程執(zhí)行成功之后,數(shù)據(jù)庫(kù)中version的值就會(huì)變?yōu)?,剩下的進(jìn)程不會(huì)執(zhí)行成功,這樣保證了stock的值不會(huì)小于0

Map<String, Object> map = new HashMap<>();
map.put("id", id);
map.put("version", version);
int result = goodsMapper.newMinStock(map);

if (result != 1) {
    throw new RuntimeException("更新商品庫(kù)存失敗");
}

在業(yè)務(wù)層判斷更新庫(kù)存是否成功,進(jìn)行相應(yīng)的業(yè)務(wù)處理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 引言為什么需要鎖(并發(fā)控制)?在多用戶(hù)環(huán)境中,在同一時(shí)間可能會(huì)有多個(gè)用戶(hù)更新相同的記錄,這會(huì)產(chǎn)生沖突。這就是著名的...
    刀刃丿閱讀 776評(píng)論 0 0
  • 重復(fù)添加購(gòu)物車(chē) 背景 購(gòu)物車(chē)中同一商品只能有一條記錄添加購(gòu)物車(chē)時(shí),如果商品已經(jīng)存在,則在原來(lái)的數(shù)量上增加;如果不存...
    齊晉閱讀 2,675評(píng)論 4 11
  • 本質(zhì): 悲觀鎖和樂(lè)觀鎖都是一種概念和認(rèn)知。數(shù)據(jù)庫(kù)有java語(yǔ)言都有對(duì)應(yīng)的實(shí)現(xiàn)方式。 悲觀鎖 悲觀鎖(Pessimi...
    極簡(jiǎn)架構(gòu)閱讀 887評(píng)論 0 3
  • 一、事務(wù) 1、事務(wù)四要素:ACID 對(duì)于事務(wù),我之前的理解是很粗糙的,不就是為了保證操作的原子性么?一般訂單系統(tǒng)或...
    張偉科閱讀 1,515評(píng)論 0 5
  • Milestone 本文需要閱讀時(shí)間大約在1小時(shí),請(qǐng)抽出完整的時(shí)間來(lái)閱讀,一目十行,真心沒(méi)用 后面會(huì)按照下圖,分批...
    你好Max閱讀 39,147評(píng)論 53 132

友情鏈接更多精彩內(nèi)容