背景介紹
通常我們在接口里要保存一條數據時,會先判斷該條記錄在數據庫里是否存在,如果不存在就插入,如果存在就返回已經存在。
就拿常見的工單來舉例
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="該工單已存在"; }
