事务问题处理

需求:

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

处理:

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

REQUIRED:如果当前没有事务,就新建一个事务。如果当前存在事务,则加入这个事务。这是最常见的选择。 SUPPORTS:如果当前没有事务,就以非事务方式执行。 如果当前有事务,则使用事务。MANDATORY:如果当前没有事务,就抛出异常。 REQUIRES_NEW:如果当前存在事务,把当前事务挂起,并且自己创建一个新的事务给自己使用。如果当前没有事务,则自己新建一个事务。 NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 NESTED:如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。

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

@Transactional@Overridepublic 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;}

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

    @Overridepublic 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;}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/624634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL存储引擎索引事务

一.存储引擎 1.创建的存储引擎 MyISAM 不支持事务、也不支持外键&#xff0c;索引采用非聚集索引&#xff0c;其优势是访问的速度快&#xff0c;对事务完整性没有要求&#xff0c;以 SELECT 、 INSERT 为主的应用基本上都可以使用这个存储引擎来创建表。 MyISAM 的表在磁盘上…

从零学Java 线程的状态

Java 线程的状态 文章目录 Java 线程的状态线程的基础状态1 常见方法1.1 休眠1.2 放弃1.3 加入1.4 优先级1.5 线程打断1.6 守护线程1.7 线程的状态 - 等待 2 线程安全问题2.1 线程同步: 同步代码块2.2 线程同步: 同步方法2.3 同步规则2.4 线程的状态 - 阻塞2.5 特殊现象: 死锁 …

新版网易滑块

突然发现脸皮厚根本没用&#xff0c;大冬天的&#xff0c;风吹过来还是会冷。 大哥们多整件衣裳&#xff0c;好冷&#xff01;&#xff01;&#xff01;&#xff01; 网易更新了&#xff0c;这俩 dt跟f值。 dt为 这里返回的&#xff0c;忽略掉他。 data参数中的d值&#xff…

未来气膜体育馆的发展趋势是什么?

未来气膜体育馆的发展趋势是多方面的&#xff0c;以下是其中几个方面的趋势。 起初&#xff0c;随着人们对体育运动的需求不断增加&#xff0c;气膜体育馆的建设和使用将成为一种趋势。气膜体育馆具有灵活性和可移动性的特点&#xff0c;可以快速搭建和拆除&#xff0c;能够适…

低代码平台,新型应用程序开发神器

目前低代码平台如火如荼。这一新兴技术为企业提供了一种高效、灵活、快速开发应用程序的方法&#xff0c;并在短时间内取得了巨大成功。然而&#xff0c;我们不得不面对低代码平台的优劣以及其所带来的挑战。本文将深入探讨低代码平台在不同情况下的优劣势&#xff0c;并与您分…

Matlab | Matlab在线性代数中的应用(附matlab代码算例)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== Matlab在线性代数中的应用 1 向量组的线性相关性2 线性方程组3 相似矩阵…

AI能否真的取代程序员?

一个Java程序员从接到需求到最终开发完功能的流程大致如下 首先是理解原型图&#xff0c;设计表结构根据表结构编写增删改查代码与前端联调&#xff0c;完成功能开发 那么以上步骤AI能不能完成呢&#xff1f; 让我们试一下&#xff1a; 第一步&#xff0c;使用 AI助手 解析流…

设计模式之状态模式【行为型模式】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某…

postman环境变量全局变量设置

postman环境变量、全局变量设置 在公司中&#xff0c;一般会存在开发环境、测试环境、线上环境等&#xff0c;如果需要在不 同的环境下切换做接口测试&#xff0c;显然我们需要把所有接口的域名进行修改&#xff0c;如果接 口测试用例较多&#xff0c;那么修改会非常费力&…

Redis基础系列-哨兵模式

Redis基础系列-哨兵模式 文章目录 Redis基础系列-哨兵模式1. 引言2. 什么是哨兵模式&#xff1f;3. 哨兵模式的配置4. 哨兵模式的启动和验证4.1 主master宕机&#xff0c;看会出现什么问题4.2 重启6379主机 5. 哨兵模式的工作原理和选举原理5.1. SDown主观下线&#xff08;Subj…

基于Python实现地标景点识别

目录 前言简介地标景点识别的背景 地标景点识别的原理卷积神经网络&#xff08;CNN&#xff09;的基本原理地标景点识别的工作流程 使用Python实现地标景点识别的步骤数据收集数据预处理构建卷积神经网络模型模型训练 参考文献 前言 简介 地标景点识别是一种基于计算机视觉技术…

Qt SDL2播放Wav音频

这里介绍两种方法来实现Qt播放Wav音频数据。 方法一&#xff1a;使用QAudioOutput pro文件中加入multimedia模块。 #include <QApplication> #include <QFile> #include <QAudioFormat> #include <QAudioOutput>int main(int argc, char *argv[]) {…

欧姆龙plc学习NJ系列CJ系列资料Sysmac Studio编程软件视频教程

Sysmac Studio是欧姆龙公司开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于编程和配置欧姆龙PLC&#xff08;可编程逻辑控制器&#xff09;和其他自动化设备。Sysmac Studio支持以下型号的欧姆龙PLC&#xff1a;1. NJ系列&#xff1a;NJ501、NJ301、NJ101、…

【算法】算法(模拟、指针等)解决字符串类题目(C++)

文章目录 1. 前言2. 解决 字符串类算法题14.最长公共前缀5.最长回文子串67.二进制求和43.字符串相乘 1. 前言 字符串题目有很多种&#xff0c;这里筛选几个考察模拟、双指针等的题目&#xff0c;并用相关算法解决。 2. 解决 字符串类算法题 14.最长公共前缀 思路 题意分析&…

【固态钽表面贴装电容】 MIL-PRF-55365 美军标

钽电解电容器是体积效率、电气参数稳定、高可靠性和长使用寿命是主要考虑因素的应用的首选。 钽/氧化钽/二氧化锰系统的稳定性和对高温的耐受性使固体钽消泡器成为当今表面贴装组装技术的合适选择。 钽不是纯净状态的。 相反&#xff0c;它通常存在于许多氧化物矿物中&#xf…

编曲混音FL Studio21.2对电脑有什么配置要求

FL Studio 21是一款非常流行的音乐制作软件&#xff0c;它可以帮助音乐人和制作人创作出高质量的音乐作品。然而&#xff0c;为了保证软件的稳定性和流畅性&#xff0c;用户需要知道FL Studio 21对电脑的配置要求。本文将介绍FL Studio 21的配置要求&#xff0c;以帮助用户选择…

Python 常见运算符汇总

Python常用的运算符有以下这些&#xff1a; 1、算术运算符&#xff1a; 运算符描述加法-减法*乘法/除法&#xff08;结果为浮点数&#xff09;//整除&#xff08;结果为整数&#xff09;%取模&#xff08;取余数&#xff09;**幂运算 如&#xff1a; a 10 b 3print(a b)…

SQL基础知识4

一、内置函数 1、数值函数 1.1基本函数 1.2时间函数 二、存储过程 1、概述 2、分类 3、创建 4、总结 多了很多传递参数 三、存储函数 说明定义 例子 案例1 方法一 方法二 案例2 例子3 对比 复习

【贪心】受标签影响的最大值

/** 贪心&#xff1a;要想使子集分数最大&#xff0c;应选取values中较大的值。* 思路&#xff1a;使用一个哈希表来记录每个标签使用的次数&#xff0c;相同标签使其不超过useLimit限制* 对values进行降序排序&#xff0c;并对其进行遍历只要标签使用次数不超过限制就…

2401C++,C++自动注册

原文 一个常见的场景是,在主函数之前把一些函数注册到映射里,这些函数和某些键关联. 映射<串, 函数<整(整)>> g映射; 整 注册函数(串 键, 函数<整(整)> f) {g映射.原位(移动(键), 移动(f));中 0; } 注册函数("a", [](整 a){中 a;});整 主() {输出…