提高系統(tǒng)穩(wěn)定性-冪等性-樂觀鎖

前言

接下來討論一下修改冪等性的第一個方案

數(shù)據(jù)庫冪等性

假設(shè)我們有一個 user 表, 每次有人注冊就向其中插入一條記錄, 我們要保證修改的冪等性, 初步的想法可以有二種: 第一種是先在數(shù)據(jù)庫里查詢一下, 如果沒有這個 email, 就像數(shù)據(jù)庫里插入一條, 第二種是先刪除這個email的記錄然后插入一條新的email;

我們先假設(shè)查詢(刪除)操作和插入操作不在同一個事務(wù)中, 會出現(xiàn)一種情況大概如下:


刪除也是類似的情況, 所以單純的先查(刪)后插的方式不能夠解決這個問題.

這時候呢, 可能有的小伙伴會發(fā)現(xiàn), 這個可能是由于查詢(刪除)操作和插入不在同一個事務(wù)里導(dǎo)致的, 如果在一個事務(wù)里是不是能夠解決這個問題呢.

這就涉及到事務(wù)隔離級別了, 其中分為讀未提交, 讀已提交, 可重復(fù)讀和可序列化, 講述這四種隔離級別的文章的挺多了, 其中可序列化能解決上面的問題但是性能和并發(fā)度不高, 另外應(yīng)用程序強(qiáng)依賴數(shù)據(jù)庫隔離級別太脆弱了.

樂觀鎖方案

為了兼顧性能和安全我們可以在建表的時候增加唯一鍵:

createuniqueindexuser_email_uindexonuser(email);

情況就會變成下面這樣:


比如有些場景沒有郵箱這樣明顯的唯一鍵, 可以自己手動生成一個, 比如用戶打開表單頁面就生成一個 uid 返回給前端, 前端重復(fù)點(diǎn)擊不會導(dǎo)致重提, 還可以根據(jù)統(tǒng)一的時間戳或者版本號來防止并發(fā)的修改導(dǎo)致的非預(yù)期的效果

但是這種方案也存在缺點(diǎn)

對數(shù)據(jù)庫有壓力, 尤其是沖突可能性過大會導(dǎo)致大量的事務(wù)回滾, 性能壓力就更大, 其實有點(diǎn)像定義一個方法, 輸入一個字符串, 判斷是否是整數(shù), 可以直接調(diào)用轉(zhuǎn)換方法, 拋出異常就返回不是整數(shù), java 規(guī)范中都不建議這么操作, 因為 trycatch 代價太高, 最好是先判斷一下是否符合正則等, 判斷是不是符合一般的情況, 然后再做轉(zhuǎn)換.

場景有限, 需要所需的數(shù)據(jù)庫支持樂觀鎖方式, 有些操作或者一些非關(guān)系型數(shù)據(jù)庫不能支持樂觀鎖, 這種方式就沒法使用

業(yè)務(wù)復(fù)雜起來樂觀鎖考慮的場景就更復(fù)雜, ABA 問題等, 比如上面的例子一瞬間, 第一次點(diǎn)擊的事務(wù)已經(jīng)注冊上去了, 又注銷了, 第二次點(diǎn)擊產(chǎn)生的事務(wù)又注冊上了,,, 或者業(yè)務(wù)邏輯很復(fù)雜, 不單單是插入一張表, 還需要發(fā)一封郵件, 還需要增加角色配置等, 樂觀鎖的使用場景就要考慮很多問題, 不然會導(dǎo)致多發(fā)郵件等等問題

聊完了樂觀鎖的缺點(diǎn), 我們后面的文章講述下其他方式來保證冪等性盡可能的消除樂觀鎖帶來的問題.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末波势,一起剝皮案震驚了整個濱河市徙赢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌礁芦,老刑警劉巖正勒,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件得院,死亡現(xiàn)場離奇詭異,居然都是意外死亡章贞,警方通過查閱死者的電腦和手機(jī)祥绞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鸭限,“玉大人蜕径,你說我怎么就攤上這事“芫” “怎么了兜喻?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赡麦。 經(jīng)常有香客問我朴皆,道長,這世上最難降的妖魔是什么泛粹? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任遂铡,我火速辦了婚禮,結(jié)果婚禮上晶姊,老公的妹妹穿的比我還像新娘扒接。我一直安慰自己,他們只是感情好们衙,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布钾怔。 她就那樣靜靜地躺著,像睡著了一般蒙挑。 火紅的嫁衣襯著肌膚如雪宗侦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天忆蚀,我揣著相機(jī)與錄音凝垛,去河邊找鬼。 笑死蜓谋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的炭分。 我是一名探鬼主播桃焕,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捧毛!你這毒婦竟也來了观堂?” 一聲冷哼從身側(cè)響起让网,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎师痕,沒想到半個月后溃睹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胰坟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年因篇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笔横。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡竞滓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吹缔,到底是詐尸還是另有隱情商佑,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布厢塘,位于F島的核電站茶没,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晚碾。R本人自食惡果不足惜抓半,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迄薄。 院中可真熱鬧琅关,春花似錦、人聲如沸讥蔽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冶伞。三九已至新症,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間响禽,已是汗流浹背徒爹。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芋类,地道東北人隆嗅。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像侯繁,于是被迫代替她去往敵國和親胖喳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

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