telephone 为空 唯一索引_记一次线上唯一索引失效没有起效的场景
背景描述:我們系統A做遠程在線接口提供給B系統調用,每次的請求參數中都帶有冪等單號用來做冪等校驗,冪等單號對應的字段是不可空且唯一的。由于對應的業務表線上已有數據,這個冪等字段數據新加的字段,所以要做初始化數據,給每條記錄設置一個冪等值進去。
第1次的方案:在入參進來的時候根據查詢方案selectCount了此冪等號對應的數據記錄,首先不說selectCount方法的性能(全表掃描),其次這種提前的查詢不支持并發的情況,并發情況下,插入的數據對插入的數據不可見的,這樣就不能報賬冪等,數據的唯一性。(被狠狠的diss了一頓)
第2次的方案:由于上面的方法不保險不可行,必須在數據庫給冪等字段加唯一索引,而唯一索引的字段不可空,加上之前新增的冪等字段設置的可空,螞蟻數據庫限制,不可將可空的字段設置為不可空,所以又得新加字段,設置不可空為冪等字段,然后再在這個冪等字段上加唯一索引,然后在插入數據時,先插入數據,如果插入異常,而且是唯一鍵異常,則捕獲此異常,給接口返回true。貌似這樣的方法在線下沒錯誤,實則是憑了運氣。后續將下面。(線上唯一索引又沒生效,并發導致重復數據進來,直接被批了一頓,幸虧數據可以刪除,數據量不大)。
第3次的方案:為何第2次的方案不可行呢?因為唯一索引執行時,有條件的。1、字段值不能為空 2、字段值不能重復。再加上以為有數據庫兜底的校驗機制,就將代碼查詢校驗的給去掉了,結果唯一索引也沒有生效,索引冪等形同虛設。這是一次慘痛的教訓,被噴成shit了。
正確的做法:以代碼提前查詢(找一個效率高的查詢,不要全表掃描,數據量過大會影響性能的),再加上必須生效的唯一索引。
唯一索引執行成功的方法步驟:
1、應該先加字段,
2、然后初始化不同的值到冪等字段,
3、然后再加唯一索引這樣才會使得唯一索引生效。不能將表結構變更(添加字段和添加索引放在一起執行,這樣的話唯一索引一定不成功)。
總結:這次反復在同一個問題犯錯,想想原因:1、基礎太差,并發不了解,數據庫不了解唯一索引的用法 2、螞蟻數據庫線上和線下索引(兩天才能生效)執行的不同 3、唯一索引執行生效的步驟不了解。
推薦學習:如何保證冪等 :https://mp.weixin.qq.com/s/yeYqeQMzI6hpkNPh9TWJWQ
高并發的核心技術-冪等的實現方案:https://mp.weixin.qq.com/s/aqlWMxnneFhSIFJBPMW25A
冪等設計:https://mp.weixin.qq.com/s/MULK4lEuksByZcjGq29-2Q
如何設計一個冪等接口:https://mp.weixin.qq.com/s/wDBAou-nmJ2fzr5CM7j_TA
總結
以上是生活随笔為你收集整理的telephone 为空 唯一索引_记一次线上唯一索引失效没有起效的场景的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySql数据库常用命令宝典
- 下一篇: 2021年慈溪中学高考成绩查询,2021