利用无事务方式插入数据库解决并发插入问题

一、背景

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

二、方案

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.获取插入后的自增主键id
        int 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值