在工作中經(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ù)提交限制