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