并發(fā)情況下冪等性(&多次提交問(wèn)題) 處理

在工作中經(jīng)常遇到數(shù)據(jù)重復(fù)的問(wèn)題,產(chǎn)生的臟數(shù)據(jù)有的影響比較小,有的就影響比較大了。最近遇到這個(gè)問(wèn)題,就記錄一下,并附上解決方案。一起干飯!

  • 表單錄入如何防止重復(fù)提交?

  • 微服務(wù)架構(gòu)中,客戶端重試如何防止重復(fù)提交?


1.冪等性概念

冪等(idempotent、idempotence)是一個(gè)數(shù)學(xué)與計(jì)算機(jī)學(xué)概念,常見(jiàn)于抽象代數(shù)中。

在編程中一個(gè)冪等操作的特點(diǎn)是其任意多次執(zhí)行所產(chǎn)生的影響均與一次執(zhí)行的影響相同。冪等函數(shù),或冪等方法,是指可以使用相同參數(shù)重復(fù)執(zhí)行,并能獲得相同結(jié)果的函數(shù)。這些函數(shù)不會(huì)影響系統(tǒng)狀態(tài),也不用擔(dān)心重復(fù)執(zhí)行會(huì)對(duì)系統(tǒng)造成改變。(百度百科)

2.什么情況下需要冪等性

  • 重復(fù)提交
  • 接口重試
  • 前端業(yè)務(wù)操作抖動(dòng)

并不是所有的業(yè)務(wù)都需要冪等性,要根據(jù)實(shí)際業(yè)務(wù)確定是否需要冪等性。在我看來(lái),冪等性的重點(diǎn)還是外界對(duì)接口的干擾性問(wèn)題。

3. 保證冪等性的策略分析

保證冪等性的核心思想:通過(guò)一個(gè)唯一序號(hào)保證冪等(如果一個(gè)業(yè)務(wù)操作我們賦予它一個(gè)唯一業(yè)務(wù)id,如果這個(gè)業(yè)務(wù)操作內(nèi)容一樣,那么這個(gè)業(yè)務(wù)id就不變,這個(gè)時(shí)候有多個(gè)一模一樣的業(yè)務(wù)id到后臺(tái),就可以進(jìn)行判斷了)

非并發(fā)情況下只需要查詢這個(gè)業(yè)務(wù)單號(hào)是否有操作過(guò),如果沒(méi)有執(zhí)行即可

并發(fā)情況整個(gè)過(guò)程用加鎖來(lái)實(shí)現(xiàn)

4. 業(yè)務(wù)操作的冪等性分析

  • Select:查詢操作不需要考慮冪等,對(duì)數(shù)據(jù)不會(huì)產(chǎn)生任何影響,天然冪等

  • Delete:刪除操作,第一次修改成功后就不會(huì)有任何返回,后續(xù)啊不再執(zhí)行了,也就不用考慮冪等了,但有一個(gè)問(wèn)題,刪除操作無(wú)論使用什么條件最后都轉(zhuǎn)換到唯一id進(jìn)行刪除

  • Update:這個(gè)就需要考慮冪等

    • 如果更新你的工資,20k,30k,update table set salary=30 where id=1001,這就不需要冪等

    • 如果是自增方式:update table set salary+10 where id=1001,需要設(shè)計(jì)冪等

  • Insert:由于是新增操作沒(méi)有唯一單號(hào),就需要通過(guò)token的形式使用冪等

  • 混合操作:如果這一組業(yè)務(wù)有一個(gè)唯一單號(hào),就可以使用這個(gè)單號(hào)進(jìn)行鎖操作,如果沒(méi)有就需要增肌token進(jìn)行冪等設(shè)計(jì)

5. 冪等性的具體設(shè)計(jì)分析

  • 修改操作的冪等設(shè)計(jì)

    • 修改數(shù)據(jù)前一定是先查詢并獲得數(shù)據(jù)了

    • 獲得的數(shù)據(jù)里要加上版本號(hào)version、update_time

    • 修改的時(shí)候使用這個(gè)version作為條件,如果條件不符更新肯定不成功

    • 更新同時(shí)變更version

    • 實(shí)際上就是使用了樂(lè)觀鎖和update行鎖實(shí)現(xiàn)冪等

  • insert操作的冪等性設(shè)計(jì)

    • 根據(jù)唯一單號(hào)進(jìn)行設(shè)計(jì):比如限購(gòu),一個(gè)用于只能購(gòu)買(mǎi)一個(gè)(uid+pid)給這個(gè)組合設(shè)置唯一索引

    • 沒(méi)有唯一單號(hào):用戶提交數(shù)據(jù)或form表單事重復(fù)提交導(dǎo)致的數(shù)據(jù)重復(fù)錄入

      • 通過(guò)token機(jī)制來(lái)解決

      • 在用戶打開(kāi)表單的同時(shí)生成一個(gè)唯一序列的token,提交數(shù)據(jù)時(shí)將token傳遞給后臺(tái)

      • 對(duì)這個(gè)token進(jìn)行加鎖控制,未獲得鎖的操作全部結(jié)束業(yè)務(wù)

      • 為了保證其他重復(fù)提交不獲得鎖,可以不手動(dòng)釋放鎖,待其自動(dòng)超時(shí)釋放

  • 混合操作方式

    • 一整套混合業(yè)務(wù)操作可以統(tǒng)一使用token機(jī)制來(lái)加鎖進(jìn)行重復(fù)提交限制

6. 利用spring AOP /Redis 實(shí)現(xiàn)各種情況下 防止接口重復(fù)提交問(wèn)題

實(shí)現(xiàn)各種情況下 防止接口重復(fù)提交問(wèn)題。

最后編輯于
?著作權(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)容

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