記一次線上事務(wù)并發(fā)問題

今天一同事線上遇到一個問題倒槐,程序不明原因的進(jìn)入了死循環(huán)焙贷。最后通過一步步分析代碼的線程運(yùn)行情況镜廉,定位出是事務(wù)產(chǎn)生的并發(fā)問題

我們看下代碼入口贺喝。
    @Transactional
    public Result<Boolean> execute(Map<String, String> currentRow, Map<String, String> contextInfo) {
        ...
         synchronized (this) {
              userVipCardDO.setCardNo(userVipCardService.getVipCardNo(contextInfo.get("storeId")));
         }             
    }

此方法可能多線程運(yùn)行

第2個方法代碼

private int getVipCardNo(String storeId) {
        //獲取數(shù)據(jù)庫當(dāng)前值
        SerialNumberDO serialNumberDO = serialNumberDao.getByKey(Long.parseLong(storeId), SerialBusiType.HY.getCode());
        if (serialNumberDO == null) {
            ...
            return 1;
        }
        //查出數(shù)據(jù)庫當(dāng)前值
        long counter = serialNumberDO.getCounter();
        SerialNumberDO updateDO = new SerialNumberDO();
        ...
        updateDO.setCounter(counter);
        int i = serialNumberDao.increase(updateDO);
        if(i == 0){
            return getVipCardNo(storeId);
        }else {
            return counter;
        }
    }

相當(dāng)于一個樂觀鎖 compare And Set
此處呢,由于外面synchronized單線程運(yùn)行
這是一個遞歸調(diào)用

第3個dao層sql

 <update id="increase" parameterType="SerialNumberDO">
        update sh_serial_number
        set counter = counter+1
        where store_id = #{storeId}
        and busi_type = #{busiType}
        and counter = #{counter}
</update>

樂觀鎖sql

問題出在哪呢斗幼。

  1. 第一斷代碼澎蛛,當(dāng)時所有線程進(jìn)來讀到的值都是8
  2. @Transactional 默認(rèn)事務(wù)隔離級別Repeatable read 可重復(fù)讀
    1. 這就意味著第一步多個線程進(jìn)來后。讀到的值孟岛,其它事務(wù)進(jìn)行修改提交之后瓶竭。它還是讀的當(dāng) 時進(jìn)來的這個值8
  3. 第一個線程讀到8 當(dāng)時數(shù)據(jù)庫確實是8 所以修改成 9 修改成功
  4. 第一個之后的線程呢 渠羞。
    1. 當(dāng)時進(jìn)來時開啟事務(wù)數(shù)據(jù)庫里是8
    2. synchronized等待
    3. 等第一個修改成功之后進(jìn)去select
    4. 由于事務(wù)隔離級別Repeatable read的原因斤贰,雖然數(shù)據(jù)庫里改成了9,它這里仍然讀到是8
    5. 然后update .... and counter=#{counter} 比較的時候呢,卻是比較數(shù)據(jù)庫真實的值次询,所有 8=9一直不成功
    6. 一直重試遞歸調(diào)用 進(jìn)入了死循環(huán)
問題找到了荧恍,那么最簡單的解決方案就是@Transactional(isolation = Isolation.READ_COMMITTED) 將隔離級別降低一級。讀取已提交的

最后分下這個代碼

  1. 如果不加synchronized其實也會出問題。只是出的幾率小一點(diǎn)送巡。
  2. 為了其它service方法使用默認(rèn)隔離級別摹菠,調(diào)用getVipCardNo 不出類似問題。我覺得應(yīng)該利用事務(wù)傳播行為骗爆,
    getVipCardNo開啟一個新的事務(wù)次氨,再將隔離級別設(shè)置成讀取已提交的
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摘投,隨后出現(xiàn)的幾起案子煮寡,更是在濱河造成了極大的恐慌,老刑警劉巖犀呼,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幸撕,死亡現(xiàn)場離奇詭異,居然都是意外死亡外臂,警方通過查閱死者的電腦和手機(jī)坐儿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宋光,“玉大人貌矿,你說我怎么就攤上這事≡拘耄” “怎么了站叼?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵娃兽,是天一觀的道長菇民。 經(jīng)常有香客問我,道長投储,這世上最難降的妖魔是什么第练? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮玛荞,結(jié)果婚禮上娇掏,老公的妹妹穿的比我還像新娘。我一直安慰自己勋眯,他們只是感情好婴梧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著客蹋,像睡著了一般塞蹭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讶坯,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天番电,我揣著相機(jī)與錄音,去河邊找鬼。 笑死漱办,一個胖子當(dāng)著我的面吹牛这刷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播娩井,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼暇屋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了洞辣?” 一聲冷哼從身側(cè)響起率碾,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屋彪,沒想到半個月后所宰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡畜挥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年仔粥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟹但。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡躯泰,死狀恐怖桂肌,靈堂內(nèi)的尸體忽然破棺而出忽刽,到底是詐尸還是另有隱情士骤,我是刑警寧澤笑窜,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布蛮瞄,位于F島的核電站乘瓤,受9級特大地震影響褂痰,放射性物質(zhì)發(fā)生泄漏念颈。R本人自食惡果不足惜兼搏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一卵慰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧佛呻,春花似錦裳朋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绑莺,卻和暖如春暖眼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背紊撕。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工罢荡, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓区赵,卻偏偏與公主長得像惭缰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子笼才,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Java繼承關(guān)系初始化順序 父類的靜態(tài)變量-->父類的靜態(tài)代碼塊-->子類的靜態(tài)變量-->子類的靜態(tài)代碼快-->父...
    第六象限閱讀 2,152評論 0 9
  • 1 事務(wù) 1.1 事務(wù)管理方式 spring支持編程式事務(wù)管理和聲明式事務(wù)管理兩種方式漱受。 編程式事務(wù)管理使用Tra...
    鑫奕航閱讀 2,799評論 0 1
  • 一、事務(wù) 1骡送、事務(wù)四要素:ACID 對于事務(wù)昂羡,我之前的理解是很粗糙的,不就是為了保證操作的原子性么摔踱?一般訂單系統(tǒng)或...
    張偉科閱讀 1,304評論 0 5
  • 最近一個項目需要用到https服務(wù)虐先,因為涉及直播及瀏覽器調(diào)取用戶的攝像頭及麥克風(fēng)等設(shè)備。 網(wǎng)上找了很多的例子派敷,配置...
    guozhangxiao閱讀 2,850評論 0 11
  • 小時盼過節(jié)篮愉,大來怕節(jié)到腐芍, 時光飛逝去,不覺端午來试躏, 祝福天下人猪勇,天天好節(jié)日! 端午來臨粽米香颠蕴, ...
    波羅蜜多_釋迦頓仁閱讀 673評論 0 0