在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ java高并發(fā)下,前臺購買,同時(shí)后臺修改,怎么設(shè)計(jì)不會(huì)有臟數(shù)據(jù)?

java高并發(fā)下,前臺購買,同時(shí)后臺修改,怎么設(shè)計(jì)不會(huì)有臟數(shù)據(jù)?

java代碼,用的mongodb數(shù)據(jù)庫,業(yè)務(wù)場景就是幾個(gè)商品,前臺可以購買,后臺可能會(huì)在同一時(shí)刻修改庫存或者上下線商品,怎么設(shè)計(jì)保證不會(huì)產(chǎn)生臟數(shù)據(jù)。我是新手,目前我的想法是在service層寫一個(gè)上鎖的方法,

public String update(int type, String id, int sum, int status){
    synchronized (id.intern()) {
        switch(type){
            case 1: //type為1,前臺購買,更改庫存sum
                break;
            case 2: //type為2,后臺修改,更改庫存sum(追加,不直接修改),狀態(tài)status
                break; 
            default:
                break;        
        }
    }
}

但是這樣也不太好,如果后臺減數(shù)量存在負(fù)數(shù)可能,各位前輩你們是怎么做的,我工作沒多久也沒啥思路求指路QAQ

回答
編輯回答
懷中人

使用 mongo 自帶的樂觀鎖就好了,具體例子如下:

# 假設(shè)你的記錄如下
{ 
    "_id" : ObjectId("5abf230cafcbb810e52f2e6e"), 
    "count" : 2
}

# 多線程并并發(fā)修改記錄時(shí),調(diào)用方法如下:

db.demo.update(
    {count: {$gt: 0},"_id" : ObjectId("5abf230cafcbb810e52f2e6e")},
    {$inc :{count :-1} }
)

# 因?yàn)?update 的執(zhí)行是原子性的,當(dāng)你的 count =0 后, update 就不會(huì)生效了。
# 判斷返回結(jié)果就可以了。
2018年6月14日 21:24
編輯回答
吃藕丑

除去代碼里面使用鎖實(shí)現(xiàn)以外,可以看看在數(shù)據(jù)庫層面使用樂觀鎖:https://blog.csdn.net/yown/ar...

2018年5月11日 19:10
編輯回答
心夠野

首先贊同 捏造的信仰 的觀點(diǎn),先review下業(yè)務(wù)是否合理,邏輯是否正確
防止并發(fā)一般有幾種方式:

  1. 利用數(shù)據(jù)庫本身的樂觀鎖機(jī)制,這種一般適用于并發(fā)沖突概率較小的情況,即樂觀的認(rèn)為不會(huì)引起沖突,如果高并發(fā)導(dǎo)致同一商品的修改沖突概率非常大,樂觀鎖顯然不太合適,會(huì)導(dǎo)致一方的操作失敗
  2. 通過代碼實(shí)現(xiàn)內(nèi)存級別的串行,即樓主使用的鎖機(jī)制,此類方法使代碼復(fù)雜度升高,且會(huì)影響性能,不太建議
  3. 通過消息隊(duì)列,將并發(fā)操作串行化處理,然后使用合適邏輯處理統(tǒng)一商品的同時(shí)修改(其實(shí)已經(jīng)變成串行了)
2017年2月17日 18:38
編輯回答
傲嬌范

首先,原則上每個(gè)訂單都要對應(yīng)到該商品的一個(gè)快照,也就是說購買之后不論怎么改商品信息,都不影響訂單本身。其次如果商品信息本身的修改涉及多個(gè)數(shù)據(jù)庫操作,那么必須做成事務(wù);如果實(shí)在無法實(shí)現(xiàn)事務(wù),就必須對商品暫時(shí)下線,完成修改之后再重新上線。

2018年8月19日 18:38