一、背景
由于項目中同一個網元,可能會被多個不同用戶操作,而且操作大部分都是以異步子任務形式進行執行,這樣就會帶來并發寫數據問題,本文通過利用無事務方式插入數據庫解決并發插入問題,算是解決問題的一種思路,算是拋磚引玉吧。
二、方案
1.先根據id查詢數據庫中是否存在該數據,如果存在則代表已經插入過了,直接返回
2.如果不存在此條數據,插入數據庫
3.獲取插入后的自增主鍵id
4.防止并發場景,再次查詢一次,如果id一致,則代表插入成功,如果id不一致,則代表插入失敗,刪除這條舊數據
5.如果id不一致,則代表插入失敗,刪除這條舊數據
三、代碼模擬實現
/*** 無事務插入數據庫,防止并發插入* @param nodeVo 網元信息*/public void insertNode(NodeVo nodeVo){// 1.先根據id查詢數據庫中是否存在該數據,如果存在則代表已經插入過了,直接返回NodeVo node = nodeMapper.selectById(nodeVo.getId());if(node != null){return;}int oldId = nodeVo.getId();// 2.不存在此條數據,插入數據庫nodeMapper.insert(nodeVo);// 3.獲取插入后的自增主鍵idint newId = nodeVo.getId();// 4.防止并發場景,再次查詢一次,如果id一致,則代表插入成功,如果id不一致,則代表插入失敗,刪除這條舊數據NodeVo newNode = nodeMapper.selectById(newId);if(newNode.getId() == newId){return;}// 5.如果id不一致,則代表插入失敗,刪除這條舊數據nodeMapper.deleteById(oldId);}
四、項目結構及源碼下載
源碼下載,歡迎Star: demo-springboot-mybatisplus