利用无事务方式插入数据库解决并发插入问题
一、背景
由于项目中同一个网元,可能会被多个不同用户操作,而且操作大部分都是以异步子任务形式进行执行,这样就会带来并发写数据问题,本文通过利用无事务方式插入数据库解决并发插入问题,算是解决问题的一种思路,算是抛砖引玉吧。
二、方案
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