事务问题处理

发布时间:2024年01月15日

需求:

新建一个通知,通知下面选择需要通知到的通知人,要求通知发送的时候如果通知发送失败,不能新建通知和具体的通知人关系。发送某个人失败,要求通知成功建立,其他人成功发送则建立通知和通知人的关系,失败发送的话也不影响其他人的成功。

处理:

本想想的是这个东西大概率要用事物的传播特性做吧,七个传播特性

REQUIRED:如果当前没有事务,就新建一个事务。如果当前存在事务,则加入这个事务。这是最常见的选择。 

SUPPORTS:如果当前没有事务,就以非事务方式执行。 如果当前有事务,则使用事务。

MANDATORY:如果当前没有事务,就抛出异常。 

REQUIRES_NEW:如果当前存在事务,把当前事务挂起,并且自己创建一个新的事务给自己使用。如果当前没有事务,则自己新建一个事务。 

NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 

NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 

NESTED:如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

干了半天没做出来,不确定能不能够实现,然后使用trycatch加事务注解处理了

@Transactional
    @Override
    public Map<String, Object> noticeSend(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo) {
        Map<String, Object> map = doCheck(sdssNotificationNoticeInfoQueryVo);
        if (!"0".equals(String.valueOf(map.get("status")))) {
            return map;
        }

        String staffCode = unifastContext.getUser().getStaffCode();
        sdssNotificationNoticeInfoQueryVo.setNotifierStaffNo(staffCode);
        sdssNotificationNoticeInfoQueryVo.setIfNotified(1);
        sdssNotificationNoticeInfoQueryVo.setNotificationTime(new Timestamp(System.currentTimeMillis()));

        if (-1 == sdssNotificationNoticeInfoQueryVo.getId()) {
            socialSecurityBaseMapper.createNotice(sdssNotificationNoticeInfoQueryVo);
        } else {
            //跟新通知单信息
            socialSecurityBaseMapper.updateSdssNotificationNotice(sdssNotificationNoticeInfoQueryVo);

            //删除通知单关联socialSecurityBaseMapper.deleteSdssNotificationNoticeInfo(sdssNotificationNoticeInfoQueryVo.getId());
        }

        List<SdssNotificationBaseTableInfoQueryVo> sdssNotificationBaseTableInfoQueryVos = deduplicationList(sdssNotificationNoticeInfoQueryVo.getSdssNotificationBaseTableInfoQueryVos());

        for (SdssNotificationBaseTableInfoQueryVo notificationBaseTableInfoQueryVo : sdssNotificationBaseTableInfoQueryVos) {
            try {
                SdssNotificationNoticeInfo sdssNotificationNoticeInfo = new SdssNotificationNoticeInfo();
                sdssNotificationNoticeInfo.setNotificationTableId(sdssNotificationNoticeInfoQueryVo.getId());
                sdssNotificationNoticeInfo.setYear(sdssNotificationNoticeInfoQueryVo.getYear());
                sdssNotificationNoticeInfo.setCityId(sdssNotificationNoticeInfoQueryVo.getCityId());
                sdssNotificationNoticeInfo.setStaffNo(notificationBaseTableInfoQueryVo.getStaffNo());

                socialSecurityBaseMapper.createNoticeInfo(sdssNotificationNoticeInfo);
                Map<String,Object> param = new HashMap<>();
                param.put("id",sdssNotificationNoticeInfo.getId());
                param.put("status","1");


                List<Map<String, Object>> userIdByEmployeeNumber = socialSecurityBaseMapper.findUserIdByEmployeeNumber(sdssNotificationNoticeInfoQueryVo.getNotifierStaffNo());
                String sendemployeeid = "";
                if (!userIdByEmployeeNumber.isEmpty()) {
                    sendemployeeid = String.valueOf(userIdByEmployeeNumber.get(0).get("employeeNumber"));
                }

                String reciveemployeeid = "";
                List<Map<String, Object>> userIdByEmployeeNumber1 = socialSecurityBaseMapper.findUserIdByEmployeeNumber(sdssNotificationNoticeInfo.getStaffNo());
                if (!userIdByEmployeeNumber1.isEmpty()) {
                    reciveemployeeid = String.valueOf(userIdByEmployeeNumber1.get(0).get("employeeNumber"));
                }

                String cityName = notificationBaseTableInfoQueryVo.getCityName();
                int year = notificationBaseTableInfoQueryVo.getYear();

                String title = "关于"+year+"年度"+cityName+"人员社保基数变更的通知单";
                String userid = "356442";
                String flowKey = "SocialBaseConfirm";

                StartProcessBody startProcessBody = new StartProcessBody();
                startProcessBody.setTitle(title);
                startProcessBody.setCurrentUserId(sendemployeeid);
                startProcessBody.setTaskDefinitionKey(sdssNotificationNoticeInfoQueryVo.getTaskDefinitionKey());
                startProcessBody.setBusinessKey(String.valueOf(sdssNotificationNoticeInfo.getId()));
                startProcessBody.setProcessDefinitionKey(flowKey);
                startProcessBody.setNextUserId(Arrays.asList(reciveemployeeid));
                BaseResponse<ProcessVO> result = new BaseResponse<ProcessVO>();
                result = workflowClient.start(startProcessBody);
                if (!CommonUseEnum.ONE.getValue().equals(result.getCode())) {
                    throw new RuntimeException("流程发起失败!");
                }
                socialSecurityBaseMapper.updateSdssNotificationNoticeInfoIfNotified(param);
            } catch (Exception e) {
                log.error("通知单发送失败", e.getMessage());
            }
        }
        map.put("status", 0);
        map.put("msg", "修改完成");
        return map;
    }

实话说也没有实现子流程的回滚,也是有问题的,但是完成了我的需求,我是感觉用注解是不能够完全处理问题的,我就想到用手动事务,写了一个手动提交事务的,还可以实现两个事务独立互不影响的效果

    @Override
    public Map<String, Object> noticetesttrans(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo) {
        Map<String, Object> map = new HashMap<>();
        //谁有问题谁回滚
//        TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
//        try{
//            createNotice1(sdssNotificationNoticeInfoQueryVo);
//            platformTransactionManager.commit(transactionStatus);
//        }
//        catch (Exception e){
//            map.put("status", 0);
//            map.put("msg", "修改失败");
//            platformTransactionManager.rollback(transactionStatus);
//        }
//
//        TransactionStatus transactionStatuss = platformTransactionManager.getTransaction(transactionDefinition);
//        try{
//            createNoticeInfo1(sdssNotificationNoticeInfoQueryVo);
//            platformTransactionManager.commit(transactionStatuss);
//        }
//        catch (Exception e){
//            map.put("status", 0);
//            map.put("msg", "修改失败");
//            platformTransactionManager.rollback(transactionStatuss);
//        }
        //父子结构,主体有问题,连带子一起回滚,子有问题继续处理
        TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);

        try {
            createNotice1(sdssNotificationNoticeInfoQueryVo);
            platformTransactionManager.commit(transactionStatus);
            map.put("status", 0);
            map.put("msg", "修改完成");
        } catch (Exception e) {
            platformTransactionManager.rollback(transactionStatus);
            map.put("status", -1);
            map.put("msg", "修改失败");
            return map;
        }

        try {
            createNoticeInfo1(sdssNotificationNoticeInfoQueryVo);
            map.put("status", 0);
            map.put("msg", "修改完成");
        } catch (Exception e) {
            platformTransactionManager.rollback(transactionStatus);
            map.put("status", -1);
            map.put("msg", "修改失败");
            return map;
        }


        map.put("status", 0);
        map.put("msg", "修改完成");
        return map;
    }

    /**
     * 创建消息体
     * @param sdssNotificationNoticeInfoQueryVo
     */

    public void createNotice1(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo){
        //逻辑
        socialSecurityBaseMapper.createNotice(sdssNotificationNoticeInfoQueryVo);
        //逻辑
//        int i = 1/0;

    }

    public void createNoticeInfo1(SdssNotificationNoticeInfoQueryVo sdssNotificationNoticeInfoQueryVo){
        if(sdssNotificationNoticeInfoQueryVo.getId()==0){
            sdssNotificationNoticeInfoQueryVo.setId(9999);
        }
        List<SdssNotificationBaseTableInfoQueryVo> sdssNotificationBaseTableInfoQueryVos = sdssNotificationNoticeInfoQueryVo.getSdssNotificationBaseTableInfoQueryVos();
        for (int i = 0; i < sdssNotificationBaseTableInfoQueryVos.size(); i++) {
            SdssNotificationBaseTableInfoQueryVo notificationBaseTableInfoQueryVo = sdssNotificationBaseTableInfoQueryVos.get(i);

            SdssNotificationNoticeInfo sdssNotificationNoticeInfo = new SdssNotificationNoticeInfo();
            sdssNotificationNoticeInfo.setNotificationTableId(sdssNotificationNoticeInfoQueryVo.getId());
            sdssNotificationNoticeInfo.setYear(sdssNotificationNoticeInfoQueryVo.getYear());
            sdssNotificationNoticeInfo.setCityId(sdssNotificationNoticeInfoQueryVo.getCityId());
            sdssNotificationNoticeInfo.setStaffNo(notificationBaseTableInfoQueryVo.getStaffNo());
            socialSecurityBaseMapper.createNoticeInfo(sdssNotificationNoticeInfo);

            if(i == 1){
                int qw =  1/0;
            }
        }

    }
文章来源:https://blog.csdn.net/weixin_44077141/article/details/135601785
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。