線上生產(chǎn)問題系列之 - 鎖和事務(wù)(@transactional)引發(fā)的問題

現(xiàn)象描述

運(yùn)營突然找到開發(fā)人員反饋:交易成功针史,但是賬戶數(shù)據(jù)不對。開發(fā)查看日志發(fā)現(xiàn)了大量的樂觀鎖更新異常碟狞。

背景描述

簡略的業(yè)務(wù)背景是這樣啄枕,一個交易請求過來,需要兩個主要操作族沃,一個是記錄交易記錄频祝,另一個是更新賬戶數(shù)據(jù)。這里我們默認(rèn)為這兩個操作是同步的脆淹,也就是需要在一個請求中串聯(lián)執(zhí)行完成后返回常空。
并發(fā)更新賬戶,有兩種方式:

  • 使用樂觀鎖加上重試機(jī)制未辆,也就是數(shù)據(jù)庫字段加一個字段(比如:version)更新是對比version是否是同一個窟绷,如果不是則拋異常。配合重試機(jī)制再次執(zhí)行更新操作達(dá)到最終更新完成的目標(biāo)咐柜。
  • 加鎖串行化執(zhí)行兼蜈。

兩種方案各有優(yōu)缺點(diǎn)。本文討論的是第二種方案拙友。
我們的業(yè)務(wù)系統(tǒng)實(shí)現(xiàn)時采用了第二種方案为狸,但是保留了樂觀鎖只是沒有重試機(jī)制,才有了現(xiàn)象描述中的樂觀鎖更新異常遗契。
方案的簡略代碼是這樣的:

  @Transactional
    public void transfer(......) {
      lock.lock();

       .....do something
       accountRepository.save(accountInfo)

      lock.unlock();
    }

這里的lock可以是分布式鎖也可以是synchronized及其他辐棒,這里只是個實(shí)例。這個代碼的意思是在更新賬戶的時候加鎖牍蜂,串行執(zhí)行漾根。如果鎖生效那么就不會出現(xiàn)樂觀鎖異常,那問什么鎖會失效呢鲫竞。

問題分析

回到方案最初的目的辐怕,加鎖的目的在于保證更新賬戶操作是串行的。那么在lock和unlock之間的save如果成功就達(dá)到了目的从绘。問題就出在了這里寄疏,這里的save,commit了嗎僵井?我們看這個方法是使用了@Transactional 陕截,事務(wù)交給了Spring 管理。Spring的具體實(shí)現(xiàn)方式呢就是通過AOP批什。AOP簡單點(diǎn)講就是在你方法執(zhí)行的前后去做統(tǒng)一的一個處理农曲。那么問題就來了,這個lock和unlock操作是在方法里面執(zhí)行的驻债,但是事務(wù)的提交是在unlock后切面里面執(zhí)行的朋蔫。這樣相當(dāng)于沒有生效罚渐。

解決方案

解決方案就很簡單了,鎖加在方法之外就可以了驯妄。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荷并,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子青扔,更是在濱河造成了極大的恐慌源织,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件微猖,死亡現(xiàn)場離奇詭異谈息,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凛剥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進(jìn)店門侠仇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人犁珠,你說我怎么就攤上這事逻炊。” “怎么了犁享?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵余素,是天一觀的道長。 經(jīng)常有香客問我炊昆,道長桨吊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任凤巨,我火速辦了婚禮视乐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敢茁。我一直安慰自己炊林,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布卷要。 她就那樣靜靜地躺著,像睡著了一般独榴。 火紅的嫁衣襯著肌膚如雪僧叉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天棺榔,我揣著相機(jī)與錄音瓶堕,去河邊找鬼。 笑死症歇,一個胖子當(dāng)著我的面吹牛郎笆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谷朝,長吁一口氣:“原來是場噩夢啊……” “哼惑惶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凄吏,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤远舅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痕钢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體图柏,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年任连,在試婚紗的時候發(fā)現(xiàn)自己被綠了蚤吹。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡随抠,死狀恐怖裁着,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情暮刃,我是刑警寧澤跨算,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站椭懊,受9級特大地震影響诸蚕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜氧猬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一背犯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盅抚,春花似錦漠魏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丰包,卻和暖如春禁熏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背邑彪。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工瞧毙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓宙彪,卻偏偏與公主長得像矩动,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子释漆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評論 2 359

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