@Override @Transactional(value = "transactionManager_busi", rollbackFor = Exception.class) public void buildMerchant4Api(String shopName, String userName, Long userId, String mobile, String email, String idCode) throws PayException { try { addMerchantUser(shopName, mobile, email, userName, 1, userId, idCode); } catch (DuplicateKeyException e) { //后台添加了未审核,前台自主认证 // logger.error("("+userName+")商家已提交过认证,更新信息:", e); updateMerchantUser(shopName, mobile, email, userName, 1, userId, idCode); } } @Override public void addMerchantUser(String shopName, String mobile, String email, String userName, int verifyTpe,Long userId,String idCard) throws PayException { addRegistUser(shopName, mobile, email, userName, verifyTpe, idCard); UserRole userRole = verifyTpe == 1 ? new UserRole(userName, UserRole.ROLE_PERSONAL_MERCHANT) : new UserRole(userName, UserRole.ROLE_COMPANY_MERCHANT); userRoleRepository.addUserRole(userRole); if(!merchantVerifyService.initBusPlatUserWallet(userId, verifyTpe == 1? 0:1)){ throw new PayException("用户("+userName+")初始化商家钱包失败"); } if(verifyTpe == 1) { //将个人商家放入缓存给IM使用 redisWebChat.sadd(SELLERS, String.valueOf(userId)); redisWebChat.hset(SELLER_TYPE, String.valueOf(userId), "1"); redisWebChat.sadd(MERCHANT_WAITERS.replace("MerchantUserId", String.valueOf(userId)), String.valueOf(userId)); //删除商家标签的缓存,enterprise系统getTags接口读取 redisUtil.del("merchant_tags_" + userId); } // setMerchant(userName); }
==============================
@Transactional(value = "transactionManager_busi", rollbackFor = Exception.class)
影响的是busi_plat库
userRoleRepository
操作的是HYIP库
if(!merchantVerifyService.initBusPlatUserWallet(userId, verifyTpe == 1? 0:1)){
远程调用支付的接口
BUG
@Transactional(value = "transactionManager_busi", rollbackFor = Exception.class) 只能控制busi_plat库,不能控制HYIP库,当远程调用失败时,HYIP库的事务已经提交,但是busi_plat库的操作回滚了,导致出现了数据不一致的情况
解决办法
1 加入补救措施(DB操作比远程调用更加靠谱)
在调用支付接口失败时,手动把HYIP库的数据回滚掉(此回滚存在失败的可能) ,防止出现数据不一致的
2 分布式事务