介面資料防重
阿新 • • 發佈:2018-11-10
系統應用之間互動,實際上就是各系統後臺資料的處理,這裡簡單記錄下資料防重的一些手段。
重複呼叫
例如,使用者在商城下單後,商城系統向訂單系統下發訂單資料。訂單系統接收到資料後,插入資料庫。
虛擬碼:
orderDao.insert(Order);
正常情況下,接收資料後儲存。資料看起來沒有什麼問題。但系統總會有一些異常情況。假如系統執行的某一天,商城系統由於一些情況,下發了多次訂單資料(介面重複呼叫),那麼訂單系統就會接收到多次訂單資料,並插入資料庫,上面的插入程式碼就不能保證訂單資料唯一了。
介面防重
解決上面介面重複呼叫的情況有很多種,下面列舉下我工作中常見的:
1. 唯一索引
給order表增加order_id唯一索引,同一個order_id不管插入多少次,資料庫只會存在一條。重複插入mysql會報主鍵重複異常。
在存在唯一索引的情況下:
2. insert ignore into
insert ignore表示,如果order表中已經存在相同的記錄,則忽略當前新資料,重複插入mysql不會報主鍵重複異常。
3. replace into
replace into 插入資料的時候會檢查:
3.1 如果表中已存在相同的order資料,則先刪除已存在的資料,然後插入新的資料
3.2 如果不存在相同的order資料,則直接插入新資料
4. insert into on duplicate key update
當插入資料的時候:
4.1 如果表中已存在相同的order資料, 則執行on duplicate key update後面的更新語句
4.2 如果不存在相同的order資料,則直接插入新資料