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

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 insert
            int 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) {
                // 拼接SQL
                String 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) ;
                }

                // 拼接SQL
                upfields = 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;
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

spring boot3x登录开发-上(整合jwt)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 jwt简介 导依赖 编写jwt工具类 1.配置项直接嵌入代码&#xff0c;通过类名.静态方法使用 2.配置项写到…

大数据 - Spark系列《三》- 加载各种数据源创建RDD

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 目录 3.1&#x1f9c0;加载文件(本地) 1. 加载本地文件路径 &#x1f32e;使用te…

让IIS支持SSE (Server Sent Events)

本文只探讨IISPython网站的情况&#xff0c;对于asp.net也应该不用这么麻烦。 先上结论&#xff1a;用反向代理&#xff1a; IIS URL Rewrite waitress Waitress是一个纯python编写独立的WSGI服务器&#xff0c;功能比Gunicorn弱一些&#xff0c;但可以运行在windows平台上&…

基于springboot智慧养老平台源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计。本项…

牛客周赛 Round 31

D. 思路&#xff1a;使用map构造两个链表。 #include <bits/stdc.h> using namespace std;map<int,int> l,r; int main() {int q;cin>>q;int op-1e9-1;int ed1e91;r[op]ed;l[ed]op;while(q--){int a;cin>>a;if(a1){int x,y;cin>>x>>y;int…

echarts使用之饼图(四)

1 基本使用 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" cont…

【Elasticsearch】从入门到精通

目前java常见的针对大数据存储的方案并不多&#xff0c;常见的就是mysql的分库分表、es存储 这里偏向es存储方案&#xff0c;es不同的版本之间其实差异还挺大的&#xff0c;本篇博文版本Elasticsearch 7.14.0 Springboot整合Easy-Es Easy-Es官方文档 Elasticsearch的初步认识 …

【MATLAB源码-第135期】基于matlab的变色龙群优化算法CSA)机器人栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 变色龙群优化算法&#xff08;Chameleon Swarm Algorithm&#xff0c;CSA&#xff09;是一种新颖的群体智能优化算法&#xff0c;受到自然界中变色龙捕食和社交行为的启发。变色龙以其独特的适应能力而著称&#xff0c;能够根…

【vue3学习P5-P10】vue3语法;vue响应式实现

0、vue2和vue3对比 框架版本API方式双向绑定原理domFragmentsTree-Shakingvue2选项式API&#xff08;Options API&#xff09;基于Object.defineProperty&#xff08;监听&#xff09;实现&#xff0c;不能双向绑定对象类型的数据【通过Object.defineProperty里面的set和get做…

【Linux网络编程三】Udp套接字编程网络应用场景

【Linux网络编程三】Udp套接字编程网络应用场景 应用场景一&#xff1a;远程命令执行应用场景二&#xff1a;与Windos端相互通信应用场景三&#xff1a;简单聊天1.多线程化2.输入输出分开 应用场景一&#xff1a;远程命令执行 简单的服务器上一篇已经完成&#xff0c;接下来我…

Java项目管理01-Maven基础

一、Maven的常用命令和生命周期 1.Maven的常用命令使用方式 complie&#xff1a;编译&#xff0c;将java文件编译为class字节码文件 clean&#xff1a;清理&#xff0c;删除字节码文件 test&#xff1a;测试&#xff0c;运行项目中的test类 package&#xff1a;打包&#x…

高斯消去法 | LU分解 | PA=LU分解(MatLab)

一、问题描述 利用高斯消去法&#xff0c;LU 分解及PALU 分解求解非线性方程组。 二、实验目的 掌握高斯消去法、LU 分解、PALU 分解的算法原理&#xff1b;编写代码实现利用高斯消去法、LU 分解、PALU 分解来求解线性方程组。 三、实验内容及要求 1. 利用顺序高斯消去法求…

计算机毕业设计社区居民服务管理系统SSM

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; vue mybatis Maven mysql5.7或8.0等等组成&#xff0c;B…

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…

HTML5和CSS3强化知识总结

HTML5的新特性 HTML5的新增特性主要是针对于以前的不足&#xff0c;增一些新的标签、新的表单和新的表单属性等。这些新特性都有兼容性问题&#xff0c;基本是IE9以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这些新特性。 HTML5新增的语义…

linux实时调度

面对陌生的知识体系&#xff0c;应该从什么角度来 简介 一、进程管理基本概念 在单处理器系统上&#xff0c;在给定时刻只有一个程序可以运行&#xff0c;在多处理器系统上&#xff0c;可以真正并行运行的进程数据&#xff0c;取决于物理CPU的数目&#xff1b; 进程优先级 …

git 合并多条提交记录

我要合并多条提交记录&#xff08;合并前7条为一条&#xff09;&#xff0c;实现如下效果&#xff1a; 使用git rebase // 查看前10个commit git log -10 // 将7个commit压缩成一个commit&#xff1b;注意&#xff1a;vim编辑器 git rebase -i HEAD~4 // add已经跟踪的文件 g…

接口测试框架对比

公司计划系统的开展接口自动化测试&#xff0c;需要我这边调研一下主流的接口测试框架给后端测试&#xff08;主要测试接口&#xff09;的同事介绍一下每个框架的特定和使用方式。后端同事根据他们接口的特点提出一下需求&#xff0c;看哪个框架更适合我们。 需求 1、接口编写…

Linux 用户和权限

Linux 用户和权限 一、root 用户&#xff08;超级管理员&#xff09;1.su和exit命令2.sudo 命令3.为普通用户配置sudo认证 二、用户和用户组1.用户组管理2.用户管理3.getent 命令 三、查看权限控制信息1.认识权限控制信息 四、chmod命令五、chown命令 一、root 用户&#xff08…

怎样理解Vue单向数据流

在前端开发中&#xff0c;数据流是一个非常重要的概念。Vue.js作为一种流行的前端框架&#xff0c;采用了单向数据流的架构&#xff0c;旨在简化开发过程并提高应用的可维护性。本文将探讨Vue单向数据流的含义以及它的使用方法。 什么是单向数据流&#xff1f; 在Vue中&#…