业务场景:当进行第三方数据同步时,把所有的订单详情同步到数据库,订单中会重复出现同一号码,这里我需要通过用户手机号码查找该用户,如用户不存在,则新增一个用户。 也有想过数据库给唯一标识,但是会报异常,不符合业务场景,这里我想到单例模式的双重锁定。
//购买人手机号不存在 则以收货人手机号为用户 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 } } }