spring项目里的大事务优化

news2024/11/30 15:29:09

编程型事务更加灵活

声明式事务只需要加在方法头加@Transactional注解即可开启事务,但是还是不太灵活,意味着整个方法所进行对数据库操作都要加进事务,当然一次查询也要进入事务,这并不是我们想要的,我们在update、insert操作上进行事务操作,方便进行回滚。

public Boolean transactionCommit(String userName) {
    //查询用户
    SysUser sysUser = userMapper.selectUserByUserName(userName,null);

    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
            try {
                if (null != sysUser) {
                    //用户信息状态更新 status更新为1
                    userMapper.updateStatus(userName);
                }
            } catch (Exception e){
                //回滚
                transactionStatus.setRollbackOnly();
            }
        }
    });
    //再次查询
    SysUser sysUser1 = userMapper.selectUserByUserName(userName,"1");
    /log/.info("状态为1的用户信息"+JSON./toJSONString/(sysUser1));
    return  true;
}

非事务执行

在使用事务之前,我们都应该思考一下,是不是所有的数据库操作都需要在事务中执行?

   @Autowired
   private TransactionTemplate transactionTemplate;
   
   ...
   
   public void save(final User user) {
         transactionTemplate.execute((status) => {
            addData();
            addLog();
            updateCount();
            return Boolean.TRUE;
         })
   }

上面的例子中,其实addLog增加操作日志方法 和 updateCount更新统计数量方法,是可以不在事务中执行的,因为操作日志和统计数量这种业务允许少量数据不一致的情况。

   @Autowired
   private TransactionTemplate transactionTemplate;
   
   ...
   
   public void save(final User user) {
         transactionTemplate.execute((status) => {
            addData();           
            return Boolean.TRUE;
         })
         addLog();
         updateCount();
   }

异步处理

是不是事务中的所有方法都需要同步执行?我们都知道,方法同步执行需要等待方法返回,如果一个事务中同步执行的方法太多了,势必会造成等待时间过长,出现大事务问题。

看看下面这个列子:

   @Autowired
   private TransactionTemplate transactionTemplate;
   
   ...
   
   public void save(final User user) {
         transactionTemplate.execute((status) => {
            order();
            delivery();
            return Boolean.TRUE;
         })
   }

order方法用于下单,delivery方法用于发货,是不是下单后就一定要马上发货呢?

答案是否定的。

这里发货功能其实可以走mq异步处理逻辑。

   @Autowired
   private TransactionTemplate transactionTemplate;
   
   ...
   
   public void save(final User user) {
         transactionTemplate.execute((status) => {
            order();
            return Boolean.TRUE;
         })
         sendMq();
   }

事务优化例子

背景

我最近开发写的一个接口,大致是这么一个逻辑,我需要根据页面的提交的数据生成一个收款单,整体接口处理的业务如下,我把它们写在了一个接口里,可以理解为这是一个大事物,这个接口执行的时间是相对比较长的,而且将这些逻辑全部写在一个接口里面,本身来说也是不太合理的。

在这里插入图片描述

优化方案-异步并行处理

事务里如果无法避免远程调用,那么肯定是需要进行异步调用,因为无法保证远程接口的及时响应性,CompletableFuture异步编排特性可以用到,task1和task2任务结束后,执行task3。

CompletableFuture<Object> task1 =CompletableFuture.supplyAsync(() -> {
    System.out.println("单号check线程" + Thread.currentThread().getId());
    //单号check接口 校验失败抛出异常

    return "账单实体信息";
}, executor);
CompletableFuture<Object> task2 = CompletableFuture.supplyAsync(() -> {
    System.out.println("收款单生成线程" + Thread.currentThread().getId());
    try {
        //收款单生成

        return “账单编号”;
        Thread.sleep(3000);
        System.out.println("任务2结束:");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}, executor);

 //task1、task2 执行完执行task3 ,需要感知task1和task2的执行结果
CompletableFuture<Boolean> future = task1.thenCombineAsync(task2, (t1, t2) -> {

    System.out.println("账单金额回写线程" + Thread.currentThread().getId());
    // t1 、t2返回判断

    //回写返回结果
    return ture;
}, executor);

总结

处理大事务的6种办法:

  • 少用@Transactional注解
  • 将查询(select)方法放到事务外
  • 事务中避免远程调用
  • 事务中避免一次性处理太多数据
  • 非事务执行
  • 异步处理

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

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

相关文章

电容笔和触控笔哪个好用?2023平价好用的电容笔测评

其实&#xff0c;许多产品各有特色&#xff0c;有的注重外观&#xff0c;而有的注重功能。ipad上的那支笔也是如此的。所以&#xff0c;购买电容笔的时候&#xff0c;必须对电容笔有充分的了解。在选购前&#xff0c;必须了解各种类型的电容笔&#xff0c;以决定选购何种电容笔…

ASEMI代理LTC3309AEV#TRMPBF原装ADI车规级LTC3309AEV#TRMPBF

编辑&#xff1a;ll ASEMI代理LTC3309AEV#TRMPBF原装ADI车规级LTC3309AEV#TRMPBF 型号&#xff1a;LTC3309AEV#TRMPBF 品牌&#xff1a;ADI /亚德诺 封装&#xff1a;LQFN-12 批号&#xff1a;2023 安装类型&#xff1a;表面贴装型 引脚数量&#xff1a;12 工作温度:-4…

数字演播厅全新上线,让您的业务展示事半功倍

向客户汇报时还在手忙脚乱找应用&#xff1f; 给领导汇报时还在尴尬的等待应用漫长的加载&#xff1f; 还在因为没有合适的控制设备而施展不开拳脚&#xff1f; 为帮助广大易知微用户提升演示汇报效果&#xff0c;易知微平台上线了「数字演播厅」功能&#xff0c;该功能专注…

22. Unity - 3D游戏开发小计01 --- 修复动画BUG、更改环境光照、导航网格、相机跟随、场景渲染后期处理

1. 导入玩家角色模型 素材来自于unity官网:3D Beginner:Tutorial Resources 在3D游戏开发中,三维物体模型一般会有团队内的其它成员提供,包括模型本身和动画文件等。我们需要做的是将这些素材进行组合并使用代码进行控制。 若对模型添加动画文件后,当运行时可能会发现模型…

OPPO舍弃芯片研发,让人想起欧洲芯片,国产芯片会从此溃败么?

OPPO一瞬间舍弃芯片研发&#xff0c;对国产芯片造成的影响无疑是非常大的&#xff0c;甚至可能导致国产芯片的研发由此溃败&#xff0c;这可以从当年欧洲的芯片业务衰败作为前车之鉴。 GSM称霸2G时代&#xff0c;也让欧洲手机和欧洲芯片企业取得优势&#xff0c;当年爱立信手机…

小红书文案怎么写才能吸引用户,品牌写文技巧

在小红书平台&#xff0c;文案是笔记非常重要的一环&#xff0c;那么文案怎么写才能吸引人呢?下面就让我们来聊一聊小红书文案写作的一些技巧&#xff0c;希望可以对大家有所帮助。 一、 标题 一个好的标题是非常重要的&#xff0c;这相当于是一篇笔记的门面&#xff0c;决定着…

什么是 Java 中的 AOP(面向切面编程)?如何使用它来实现横切关注点?

AOP&#xff08;Aspect-oriented programming&#xff0c;面向切面编程&#xff09;&#xff0c;是一种编程思想和技术&#xff0c;旨在将横切关注点和主业务逻辑分离&#xff0c;使得系统更容易扩展和维护。在 Java 中&#xff0c;AOP 主要通过代理模式和动态字节码生成实现。…

不限次数的chatGPT

不说废话直接看方法&#xff1a; 不用翻墙&#xff0c;开干 第一步&#xff1a;打开电脑的Edge浏览器&#xff0c;就是windows系统的默认浏览器&#xff0c;搜索wetab&#xff0c;点击如下的官方链接就会进入安装插件界面 第二步&#xff1a;点击chat AI就会弹出这个弹窗&…

如何将 Docker 镜像大小从 1.43 GB 减少到 22.4 MB

如果你正在从事 Web 开发&#xff0c;那么你可能已经了解过容器化的概念以及它的优点。 但是&#xff0c;当使用 Docker 时&#xff0c;镜像大小是一个很大的问题。仅仅是从 create-react-app 中得到的样板项目就通常超过 1.43 GB。 今天我们将会容器化一个 ReactJS 应用程序…

九宫格游戏-第14届蓝桥杯省赛Scratch初级组真题第5题

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第134讲。 九宫格游戏&#xff0c;本题是2023年5月7日举行的第14届蓝桥杯省赛Scratch图形化编程初级组真题第5题&#…

渗透无回显,放弃 or 看这篇文章

渗透无回显&#xff0c;放弃 or 看这篇文章 1.DNSlog工具2.DNSlog回显原理3.无回显的XXE 1.DNSlog工具 如果有自己的服务器和域名&#xff0c;可以自建一个这样的DNSlog平台用于进行渗透数据外带&#xff0c;或者直接使用BugScan团队开源的工具搭建即可&#xff1a; Github:D…

初识kubernetes

初识kubernetes 1.应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与缺点&#xff1a;不能为应用程…

汽车牌照目标检测(Python代码)

1.数据集 Chinese City Parking Dataset 2.代码流程&#xff1a; 代码的主要流程如下&#xff1a; 导入所需的库和模块&#xff0c;包括警告过滤、数据处理、数据可视化等。 创建用于显示样本图像的子图。 从数据集中加载样本图像并显示在子图中。 提取样本图像的元数据&…

2023HAS华为分析师大会:华为认证推动数字化转型向前发展

4月19日&#xff0c;华为数字化人才成熟度模型正式作为TM Forum TOD (Tech Organization Design)标准文档对外发布。该模型由华为联合TMF组织、运营商客户专家学者共同研发&#xff0c;旨在帮助企业从组织、人才、文化维度进行评估&#xff0c;指导人才发展。 在2023华为分析师…

基于混沌集成决策树的电能质量复合扰动识别(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【mongoose】vue3+vite使用mongoose | mongoose7.0使用

前言 注意&#xff1a; 个人认为中文文档仅适合学习参考&#xff0c;英文文档才真正适合项目中使用因为中文文档可能没有同步官网最新文档。比如中文文档版本是5.x&#xff0c;但官网最新版文档是7.x&#xff0c;api已不支持回调&#xff0c;改为Promise&#xff0c;若使用了…

mysql入门:ddl,dml,dql,dcl语句基本操作介绍

mysql入门 数据库相关概念介绍什么是数据库sql语句简介sql语句分类&#xff1a; ddl语句&#xff1a;ddl:数据库 库的创建查找&#xff1a;ddl:数据库查询数据库创建ddl&#xff1a;数据库删除 ddl:数据库 表 的操作ddl表操作&#xff1a;查询ddl 表操作——创建mysql数据类型d…

数据库管理工具【dbForge Tools for Oracle】更新!赶快来看~

Devart 提供包括Oracle、SQL Server、MySQL、PostgreSQL、InterBase以及Firebird在内的专业数据库远程管理软件&#xff0c;dbForge Studio for MySQL是一个在Windows平台被广泛使用的MySQL客户端&#xff0c;它能够使MySQL开发人员和管理人员在一个方便的环境中与他人一起完成…

SpringBoot——整合MyBatis

前情回顾&#xff1a; 在开始介绍SpringBoot整合MyBatis之前&#xff0c;我们先来复习一下在Spring中整合MyBaits是如何来做的。其中的核心思想是将MyBatis中的SqlSession对象交给Spring去管理&#xff0c;并且Spring提供了一个Maper接口扫描器对象去完成为Mapper接口创建动态…

Java 中常见的加密算法,DES、3DES、AES、RSA

加密算法是一种将数据转换为不可读形式的算法&#xff0c;以保护数据的机密性和完整性。加密算法被广泛应用于计算机网络、数据库、电子商务等领域&#xff0c;用于保护敏感数据的安全性&#xff0c;如用户密码、信用卡信息、医疗记录等。在 Java 中&#xff0c;有许多常见的加…