並發insert情況下數據重復插入問題的解決方案


背景介紹

通常我們在接口里要保存一條數據時,會先判斷該條記錄在數據庫里是否存在,如果不存在就插入,如果存在就返回已經存在。

就拿常見的工單來舉例

Order order = orderService.getByOrderNum(ordernum);
if(order == null){
        orderService.save(neworder);
}else{
        msg="該工單已存在";  
}

在單線程下這么寫肯定沒問題,但是如果是並發情況下,很有可能會同時插入多條記錄進數據庫。

解決方案

1.數據庫設計表的時候給工單編號ordernum設計唯一性約束。

2.代碼里雙重檢驗加鎖

Order order = orderService.getByOrderNum(ordernum);
if(order == null){
        synchronized(lock){
            Order order2 = orderService.getByOrderNum(ordernum);
            if(order2 == null){
                orderService.save(neworder);
            }

        }
        
}else{
        msg="該工單已存在";  
}    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM