保證冪等性的核心思想:通過唯一的業(yè)務(wù)單號保證冪等
- 非并發(fā)情況下,查詢業(yè)務(wù)單號有沒有操作過,沒有則執(zhí)行操作
- 針對第一次執(zhí)行業(yè)務(wù)時間,有大量并發(fā)情況下,整個操作過程加鎖,通過分布式鎖來加鎖
- Select操作:不會對業(yè)務(wù)數(shù)據(jù)有影響,天然冪等
- Delete操作:第一次已經(jīng)刪除,第二次刪除也不會有影響
- 根據(jù)唯一的業(yè)務(wù)號刪除,第一次刪除時間,已將數(shù)據(jù)刪除,第二次再次執(zhí)行時間,由于找不到相應(yīng)嘉璐,所以delete刪除的結(jié)果式0,對業(yè)務(wù)數(shù)據(jù)沒有影響,可在刪除前進行數(shù)據(jù)庫查詢
- 刪除操作沒有唯一業(yè)務(wù)號,則要看具體的業(yè)務(wù)需求,如刪除未審核的數(shù)據(jù),此時多次刪除,可能會有新的未審核的數(shù)據(jù),此時如果依然需要保證冪等性,就需要使用token機制來實現(xiàn)
- Update操作:更新操作傳入數(shù)據(jù)版本號,通過樂觀鎖實現(xiàn)冪等性
- 更新操作如果每次都是相同的值,那么不需要保證冪等性,因為值一樣
- 更新的字段的值操作是變化的,那么就會有影響,此時就是通過傳入版本號來實現(xiàn)
上述語句在mysql執(zhí)行時間,是有行鎖的,是串行的,及時有多次提交,那么版本號不一致的情況下,也是無法完成update,即實現(xiàn)了冪等update set version=version+1, xxx=${xxx} where id = xxx and version = ${version}
- Insert操作:此時沒有唯一業(yè)務(wù)號的,使用Token保證冪等
- 有唯一業(yè)務(wù)號的操作,例如:秒殺場景下,商品ID+用戶ID必須是唯一的通過分布式鎖,保證并發(fā)情況下只有一個請求能夠生成記錄,然后通過數(shù)據(jù)庫的唯一索引控制數(shù)據(jù)商品ID+用戶ID只能有一條記錄,保證接口冪等,業(yè)務(wù)執(zhí)行完后,不進行分布式鎖釋放,讓其過期自動釋放,重拾請求在鎖失效前,獲得不到鎖,也就失敗了
- 沒有業(yè)務(wù)號的操作,如注冊、點擊多次等,使用Token機制,保證冪等性,在進入到注冊頁時,后臺統(tǒng)一生成Token,返回前臺的隱藏域中。用戶提交時間,將Token一同傳入后臺使用Token作為分布式鎖的key來獲取分布式鎖,完成insert操作,執(zhí)行成功后,不釋放鎖,等待過期自動釋放,拿不到分布式鎖的則無法進行操作
文章來源地址http://www.zghlxwxcb.cn/news/detail-652472.html
文章來源:http://www.zghlxwxcb.cn/news/detail-652472.html
到了這里,關(guān)于【重復(fù)處理】CRUD接口冪等性處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!