系統應用之間交互,實際上就是各系統后台數據的處理,這里簡單記錄下數據防重的一些手段。
重復調用
例如,用戶在商城下單后,商城系統向訂單系統下發訂單數據。訂單系統接收到數據后,插入數據庫。
偽代碼:
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數據,則直接插入新數據