1.今天我向數(shù)據(jù)庫插入一條數(shù)據(jù)時出現(xiàn)了如下圖的報錯異常
exception1.jpg
2對于上面的錯誤我百思不得其解,雖然我的日志出現(xiàn)的了錯誤,但是數(shù)據(jù)竟然寫入到了數(shù)據(jù)庫中,我查了很多的博客,終于解決了這個問題.
3.解決辦法
捕獲異常架曹,適用于需要對異常處理的程序,如在進行入庫的操作上進行捕獲異常.
try{
// 入庫操作
inset into ...
}catch (DuplicateKeyException e){
// 返回響應(yīng)信息或或略
}
4.原因
根據(jù)報錯信息得知,這個錯誤是因為相同主鍵重復(fù)插入導(dǎo)致的
想到我的業(yè)務(wù)邏輯是:實時同步數(shù)據(jù)庫(A庫主數(shù)據(jù),實時同步到B庫)
1.實時接收A庫的變化,一有變化就接收binlog;
2.根據(jù)binlog的主鍵,先查詢B庫有沒有這條數(shù)據(jù),有就修改,沒有就插入,
問題就在第二步,如果并發(fā)極高,兩條相同的binlog同時過來,
第一條來了先查詢B庫,沒有發(fā)現(xiàn)這條數(shù)據(jù),執(zhí)行插入操作,正常,
就在此時,第二條binlog也來了,此時第一條還沒有插入成功,所以此時查詢B庫,結(jié)果還是沒有這條數(shù)據(jù),
然后就執(zhí)行插入操作,
此時其實B庫中是已經(jīng)插入這條數(shù)據(jù)的,所以第二次插入就會報錯,相同主鍵重復(fù)插入