由於用戶提交訂單后,用戶同時又可以再下相同的一單,這類不算為重復提交。規避的是一份訂單重復提交兩次。
思路1:
創建訂單服務保證其冪等性。后端添加訂單號服務,在用戶訂單頁面返回給頁面唯一的訂單號,在提交訂單時傳向后端訂單號,
同時數據庫中訂單表的訂單號字段設置為唯一索引,若已提交,則拋出異常,從而避免的同一訂單提交兩次。
思路1改進:
訂單號放在訂單頁面,如果用戶惡意篡改,也會發生重復提交。
這時,我們可以將生成的訂單后同時放在redis一份,當請求進來時,校驗訂單號是否存在於redis,存在則提交,不存在則為不做處理。(redis分布式鎖)
錯誤思路:
提交前,查詢當前訂單是否存在過。但是如何區分出是否是同一個訂單呢?倘若其他業務,我們可以區分出是否為同一個業務,
先查詢再根據查詢結果來判斷是否重復,這樣還會有一個問題:查詢和后續的插入操作不是原子性的,在數據庫發生臟讀的情況下,
即使查詢出未有提交,在並發的情況下,也會重復提交。
即使使用唯一訂單號,也需要在訂單表中設置自增主鍵。當使用訂單號做主鍵時,由於訂單號是不規則的,當數據量大時會產生頁分裂,從而產生性能問題
