如何防止訂單重復提交以及如何防止訂單重復確認

訂單重復問題已經是老生常談的問題了锅风,我們熟悉的淘寶購物流程兢卵,購物車-->生成訂單--》提交訂單--》訂單確認--》支付訂單--》備貨--》發(fā)貨蜈首,這里可能會有一些問題岗憋,例如肃晚,有人惡意或者無意的重復提交訂單,從而導致數據庫保存的訂單數量與實際不符仔戈,重復提交訂單導致用戶體驗不佳关串,甚至更為嚴重的是,用戶重復支付了同一個訂單监徘。所以悍缠,涉及到訂單,應該首先想清楚如何設計才能保證系統(tǒng)不會出現這些問題

如何防止訂單重復提交

首先說兩個我們購物時經常有過的體驗或者說購物網站的網頁提醒

  • 你提交的動作過快耐量,請稍后嘗試
  • 你的訂單已經超時飞蚓,請刷新頁面后重新提交
    看到這些提示,說明該購物網站做了訂單提交的限制廊蜒,一方面是防止有人惡意無限制提交訂單趴拧,所以限制了一定時間內最大可操作次數,另一方面是為了保證訂單無重復提交山叮。那么這是怎么做到的呢著榴?
    第一個應該比較簡單,限制某個時間內的最大操作次數只需要有一個計數器就可以屁倔,計數器可以用redis實現脑又,設置一個帶有有效時間的值作為計數器,如果值不存在則自動創(chuàng)建,超過某一個值就認為操作次數用完即可以實現问麸。
    第二個可以使用token機制往衷,token即令牌,學過spring security的相信對這個詞不會陌生严卖。我們可以使用類似spring security的機制在頁面上生成一個token席舍,當提交訂單時,根據該token的有效時間和允許的使用次數來判斷訂單是否允許提交哮笆,從而規(guī)避重復提交的問題来颤。當然,有人會問稠肘,在高并發(fā)的情況下福铅,如果是判斷token有效之前有很多同一個用戶的提交線程過來(用戶正常使用一般不會出現這種情況,一般是壓力測試工具導致的)项阴,那么還是會重復提交本讥,所以,這里需要用到鎖機制鲁冯,訪問同一個用戶的token同一時間只能有一個線程,token使用之后失效了就會被清掉色查,之后的線程就找不到該token薯演,從而認為訂單不能提交。

訂單確認支付

如支付寶和微信等秧了,支付寶和微信本身是怎么限制訂單只能支付一次的呢跨扮?訂單怎么保證只會被支付一次呢?這個問題相對來說就簡單很多了验毡,同一訂單的狀態(tài)更新的SQL只需要帶上條件衡创,利用的是數據庫的行鎖。當然晶通,如果是分布式系統(tǒng)璃氢,這里涉及到的問題會更多。

update table item set item.status=:newstatus where item.id = :id and item.status = oldstatus.

對比案例

  • 美團GTIS
    主要看GTIS的流程圖以及想想其交易ID的作用狮辽,交易之前一也,后臺會返回一個交易ID給前端,前端在點擊交易按鈕時需將該交易ID和其他交易信息同時返回給后臺進行處理喉脖,通過全局的交易ID實現“該次交易的”冪等性
    美團GTIS.png

參考資料和研究

  • 分布式鎖的對比分析:非常好的一篇文章椰苟,包含下面的關鍵詞:可重入、阻塞树叽、公平舆蝴、排他、樂觀、悲觀洁仗、單點层皱、死鎖發(fā)生、連接池狀況京痢、實現種類奶甘、實現方式
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市祭椰,隨后出現的幾起案子臭家,更是在濱河造成了極大的恐慌,老刑警劉巖方淤,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钉赁,死亡現場離奇詭異,居然都是意外死亡携茂,警方通過查閱死者的電腦和手機你踩,發(fā)現死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讳苦,“玉大人带膜,你說我怎么就攤上這事≡眨” “怎么了膝藕?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長咐扭。 經常有香客問我芭挽,道長,這世上最難降的妖魔是什么蝗肪? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任袜爪,我火速辦了婚禮,結果婚禮上薛闪,老公的妹妹穿的比我還像新娘辛馆。我一直安慰自己,他們只是感情好豁延,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布怀各。 她就那樣靜靜地躺著,像睡著了一般术浪。 火紅的嫁衣襯著肌膚如雪瓢对。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天胰苏,我揣著相機與錄音硕蛹,去河邊找鬼。 笑死,一個胖子當著我的面吹牛法焰,可吹牛的內容都是我干的秧荆。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼埃仪,長吁一口氣:“原來是場噩夢啊……” “哼乙濒!你這毒婦竟也來了?” 一聲冷哼從身側響起卵蛉,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤颁股,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后傻丝,有當地人在樹林里發(fā)現了一具尸體甘有,經...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年葡缰,在試婚紗的時候發(fā)現自己被綠了亏掀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡泛释,死狀恐怖滤愕,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情怜校,我是刑警寧澤间影,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站韭畸,受9級特大地震影響,放射性物質發(fā)生泄漏蔓搞。R本人自食惡果不足惜胰丁,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喂分。 院中可真熱鬧锦庸,春花似錦、人聲如沸蒲祈。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽梆掸。三九已至扬卷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酸钦,已是汗流浹背怪得。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人徒恋。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓蚕断,卻偏偏與公主長得像,于是被迫代替她去往敵國和親入挣。 傳聞我的和親對象是個殘疾皇子亿乳,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現径筏,斷路器葛假,智...
    卡卡羅2017閱讀 134,719評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,336評論 25 707
  • 小白一枚,很想豐富自己的業(yè)余生活匠璧,也喜歡畫畫桐款。 聽了老師的課才明白了一些專業(yè)知識,不過幸虧老師講的精簡又細致夷恍。 懂...
    荔枝不怕甜閱讀 275評論 1 1
  • 江山如畫勢如鴻 日月乾坤兩袖中 登高一呼山河動 天兵鬼將莫不從
    王梓丹青閱讀 217評論 4 2
  • 北方honey閱讀 153評論 0 0