基于JVM解决重复插入同一数据到数据库的办法

博客围绕第三方数据同步业务场景展开,需将订单详情同步到数据库。当订单中同一号码重复出现时,要通过用户手机号查找用户,若用户不存在则新增。考虑数据库唯一标识会报异常,采用单例模式的双重锁定来实现该功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务场景:当进行第三方数据同步时,把所有的订单详情同步到数据库,订单中会重复出现同一号码,这里我需要通过用户手机号码查找该用户,如用户不存在,则新增一个用户。
也有想过数据库给唯一标识,但是会报异常,不符合业务场景,这里我想到单例模式的双重锁定。
//购买人手机号不存在 则以收货人手机号为用户
var mdUser = oGetMapper<MdUserMapper>().selectOne {
    eq(MdUser::phone, phone)//收货人手机号
}
//用户不存在,则新增,用户不存在,则新增,用户不存在,则新增    重要的事说三遍
if (mdUser == null) {
    synchronized(this){
        //这里再次查找用户,
        var user = oGetMapper<MdUserMapper>().selectOne {
            eq(MdUser::phone, phone)//收货人手机号
        }
        //不存再则新增
        if(user==null){
            user = MdUser(
                nickName = "",
                name = "",
                sourceType = addOrderParm.resourceType,
                createdTime = Date(),
                baseCreator = mdOtherUser.baseCreator,
                baseLastModifier = mdOtherUser.baseModifier,
                baseApplicationId = mdOtherUser.baseApplicationId,
                baseOrgId = orgId,
                mdOtherUserId = mdOtherUser.mdOtherUserId,
                phone = phone
            )
            oGetMapper<MdUserMapper>().insert(user)
            mdUser=user
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值