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