调用其他数据库,事务回滚

1、定时 JDBC 的事务

2、事务提交

3、事务回滚

样例

@Transactional(propagation = Propagation.REQUIRES_NEW)@RequestMapping(value = "/ix_work_order", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE,produces = MediaType.APPLICATION_JSON_VALUE)@ApiDesc(description = "工单拆分通知")public IfMessageOut ixWorkOrder(@RequestBody MiWoOrModel miWoOrModel) {//错误检测try {this.checkConnection();}catch (Exception e){try {Thread.sleep(300);} catch (InterruptedException ex) {}}IfMessageOut out = new IfMessageOut();Date time = DateUtil.getDate();DefaultTransactionDefinition def = null;DataSourceTransactionManager transactionManager = null;TransactionStatus status = null;try{IQueryManager t100QueryManager = BeanUtil.get(DataSourceManager.class).getQueryManager("T100TestDataSource");transactionManager = new DataSourceTransactionManager();def = new DefaultTransactionDefinition();transactionManager.setDataSource(t100QueryManager.getDml().getDataSource());status = transactionManager.getTransaction(def);String currentTime = DateUtil.currentTimeStr();String user = getUserId();if(ValueUtil.isEmpty(miWoOrModel.getDhupdtime())){miWoOrModel.setDhupdtime(currentTime);      // 拆分的时间}if(ValueUtil.isEmpty(miWoOrModel.getCrecorder())){miWoOrModel.setCrecorder(user);             // 拆分的人员(工号)}if(ValueUtil.isEmpty(miWoOrModel.getChangetype())){miWoOrModel.setChangetype("0");        // 是否变更,默认为0}// 效验必填字段checkWoOrderField(miWoOrModel);// 转换参数Map<String, Object> parmMap = getParms(miWoOrModel);// 对时间格式进行处理if(ValueUtil.isNotEmpty(parmMap.get("dintime"))){parmMap.put("dintime", DateUtil.parse((String) parmMap.get("dintime"), "yyyy-MM-dd HH:mm:ss"));}if(ValueUtil.isNotEmpty(parmMap.get("updtime"))){parmMap.put("updtime", DateUtil.parse((String) parmMap.get("updtime"), "yyyy-MM-dd HH:mm:ss"));}if(ValueUtil.isNotEmpty(parmMap.get("dhupdtime"))){parmMap.put("dhupdtime", DateUtil.parse((String) parmMap.get("dhupdtime"), "yyyy-MM-dd HH:mm:ss"));}// update by xuli, 20231224, if erp exists info, do update, not insertint existNum = 0;String checkExistSQL = "select * from dsdemo.m_mixworkorder where trim(cmaingroupid) =:cmaingroupid and trim(cproductgroupid) = :cproductgroupid";Map<String, String> checkExistMap = new HashMap<>();checkExistMap.put("cmaingroupid", miWoOrModel.getCmaingroupid());checkExistMap.put("cproductgroupid", miWoOrModel.getCproductgroupid());existNum = t100QueryManager.selectSizeBySql(checkExistSQL, checkExistMap);// 不存在数据, 做插入if (0 == existNum) {// 拼接SQLString insertSQl = getInsertSql(miWoOrModel, "dsdemo.M_MixWorkOrder");// 向 ERP 插入数据t100QueryManager.executeBySql(insertSQl, parmMap);} else {// 更新String upfields = "";Field[] fields = miWoOrModel.getClass().getDeclaredFields();for (Field field : fields) {field.setAccessible(true);try {Object value = field.get(miWoOrModel);if(ValueUtil.isNotEmpty(value)){// 批次和拆除的子批字段是作为查询字段的,不做修改if(ValueUtil.isNotEqual(field.getName(), "cmaingroupid") && ValueUtil.isNotEqual(field.getName(), "cproductgroupid")){String fieldName = field.getName() ;upfields = upfields + fieldName + " = :" + fieldName + " , "  ;}}} catch (IllegalAccessException e) {System.out.println("无法获取属性值:" + field.getName());}}// 出去字符串最后两位的 ", "if(ValueUtil.isEqual(", ", upfields.substring(upfields.length() - 2, upfields.length()))){upfields = upfields.substring(0, upfields.length() - 2) ;}// 拼接SQLupfields = upfields.replace(":dintime", "to_date(:dintime, 'YYYY-MM-DD HH24:MI:SS')");upfields = upfields.replace(":updtime", "to_date(:updtime, 'YYYY-MM-DD HH24:MI:SS')");upfields = upfields.replace(":dhupdtime", "to_date(:dhupdtime, 'YYYY-MM-DD HH24:MI:SS')");String upSql = "update dsdemo.m_mixworkorder set ";upSql = upSql + upfields + " where trim(cmaingroupid) = :cmaingroupid and trim(cproductgroupid) = :cproductgroupid" ;Map<String, Object> updateParamMap = getParms(miWoOrModel);// 向 ERP 更新数据t100QueryManager.executeBySql(upSql, updateParamMap);}out.setResult("PASS");transactionManager.commit(status);}catch(Exception e){e.printStackTrace();this.rollbackTransaction();out.setResult("FAIL");out.setErrorMessage(e.getMessage());transactionManager.rollback(status);}finally{Map<String,String> rsData = new HashMap<>();out.setRsData(rsData);BeanUtil.get(MonitorSysUtil.class).setInterfaceLog(miWoOrModel,DateUtil.dateTimeStr(time,"yyyy-MM-dd HH:mm:ss:SSS"),out,"ix_work_order");}return out;}

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

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

相关文章

BVH动画绑骨蒙皮并在Unity上展示

文章目录 Blender绑定骨骼Blender蒙皮Blender中导入bvh文件将FBX导入Unity Blender绑定骨骼 先左上角红框进入model模式&#xff0c;选中要绑定的模型&#xff0c;然后进入Edit模式把骨骼和关节对齐。 &#xff08;选中骨骼&#xff0c;G移动&#xff0c;R旋转&#xff09; 为…

dolist案例实现

这段代码是一个使用Vue.js实现的简单的ToDoList&#xff08;待办事项列表&#xff09;应用。我们分几个部分详细解释这段代码。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>todolist</title&g…

Redis——SpringBoot整合Redis实战

1、基本配置 1.1、引入依赖 首先&#xff0c;建立Maven项目&#xff0c;在Maven项目中引入pom.xml文件&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> &l…

智能优化算法 | Matlab实现合作优化算法(CSA)(内含完整源码)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现合作优化算法(CSA)(内含完整源码) 源码设计 clear clc close SearchAgents_no=30; % Number of search agents Max_iteration=1000;

刘德华恋情大揭秘:朱丽蒨一瞥倾心,豪门之女竟是谣言。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 尽管已经62岁&#xff0c;刘德华依然保持着高昂的创作热情。…

C语言贪吃蛇详解

个人简介&#xff1a;双非大二学生 个人博客&#xff1a;Monodye 今日鸡汤&#xff1a;人生就像一盒巧克力&#xff0c;你永远不知道下一块是什么味的 C语言基础刷题&#xff1a;牛客网在线编程_语法篇_基础语法 (nowcoder.com) 一.贪吃蛇游戏背景 贪吃蛇是久负盛名的游戏&…

多彩贵州人文山水展风采,微环境监测智能调控护古韵

一、人文山水时光峰峦——多彩贵州历史文化展 2月3日&#xff0c;贵州省博物馆向公众开放《人文山水时光峰峦——多彩贵州历史文化展》。6000平方米展厅里&#xff0c;从石器时期开始&#xff0c;通过六个篇章&#xff0c;用3503件文物的回忆链&#xff0c;系统化的向观众揭开…

初始vue3

文章目录 Vue3简介Vue3带来了什么性能的提升源码的升级拥抱TypeScript新的特性 Vue3.0工程使用vue-cli创建使用 vite 创建 什么是vite? Vue3简介 2020年9月18日&#xff0c;Vue.js发布了3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多…

养老院|基于Springboot的养老院管理系统设计与实现(源码+数据库+文档)

养老院管理系统目录 目录 基于Springboot的养老院管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、老人信息管理 2、家属信息管理 3、公告类型管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选…

第三百零九回

文章目录 1. 概念介绍2. 实现方法2.1 hintText2.2 labelText2.3 controller 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何在输入框中处理光标"相关的内容&#xff0c;本章回中将介绍如何添加输入框默认值.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1.…

Jenkins配置http请求github,发布release

学无止境&#xff0c;气有浩然&#xff01; Jenkins配置http请求github&#xff0c;发布release 前言Jenkins配置github配置在这里插入图片描述 打完收工! 前言 工作中进行了github迁移&#xff0c;原先的gitlab中配置的Jenkins的CI/CD步骤需要发布到Github发布release版本&am…

Go指针探秘:深入理解内存与安全性

目录 1. 指针的基础1.1 什么是指针&#xff1f;1.2 内存地址与值的地址1.2.1 内存中的数据存储1.2.2 如何理解值的地址 2. Go中的指针操作2.1 指针类型和值2.1.1 基本数据类型的指针2.1.2 复合数据类型的指针 2.2 如何获取一个指针值2.3 指针&#xff08;地址&#xff09;解引用…