spring 多线程 事务的实际应用场景

大家好,我是烤鸭:

今天分享的是spring 多线程 事务的实际应用场景:

上一篇讲了大概的原理,主要是针对事务的开始和执行过程(数据库链接,隔离级别,threadlocal线程绑定)。
https://blog.csdn.net/Angry_Mills/article/details/82502288

 

下面从实际的角度分析一下。

以下场景的演示代码地址:

https://gitee.com/fireduck_admin/demo-mutithread.git

1.  模拟场景   

    1.1 方法未加 Transactional 注解,new Thread 方式的主子线程 事务提交情况
    主线程和子线程事务分别提交(主线程提交后子线程提交)
    1.2 方法加 Transactional 注解,new Thread 方式的主子线程 事务提交情况
    主线程和子线程事务一起提交

    下面只考虑加注解方式的情况
    1.3 主线程正常,子线程异常 
    无论在new Thread 方式的子线程的run方法加不加 Transactional 注解,子线程都是以无事务方式运行
    1.4 采用springboot的 Async 注解,主线程加事务注解,子线程不加事务注解
    主线程和子线程事务一起提交
    1.5 采用springboot的 Async 注解,主线程加事务注解,子线程不加事务注解,子线程异常
    主线程和子线程事务都未提交
    1.6 采用springboot的 Async 注解,主线程加事务注解,子线程加事务注解 @Transactional(propagation = Propagation.REQUIRES_NEW)
    主线程和子线程事务分别提交(子线程提交后主线程提交)
    1.7 采用springboot的 Async 注解,主线程加事务注解,子线程加事务注解 @Transactional(propagation = Propagation.REQUIRES_NEW),子线程异常
    主线程和子线程事务都未提交
    1.8 采用springboot的 Async 注解,主线程加事务注解,子线程加事务注解 @Transactional(propagation = Propagation.REQUIRES_NEW),主线程异常
    主线程未提交和子线程事务提交

    总结一下。
    采用 异步注解的时候,配置Propagation.REQUIRES_NEW,主线程和子线程确实是两个不同的事务,分别提交。
    但是对于子线程的异常,却两个都回滚了。子线程由于异常回滚,这个是没问题的。同时将异常抛给主线程,主线程也跟着回滚了。
    我们可以认为多线程的事务是嵌套的,任何子线程的异常都会导致整个事务的事务回滚
    但是子线程如果执行完没有异常,事务会直接提交,不管主线程是否异常

2.  实际场景

     之前遇到的场景是这样的,用户和我们发起支付是同步接口,这个时候还要请求第三方的支付接口(如支付宝的接口),这时候就有个问题了。
     由于支付的异步回调如此之快,导致用订单号去数据库查找不到数据(数据还没提交入库)。
     同一个service 做这个肯定不行,就想着把入库的操作放到异步方法里做,主要保证调用第三方接口前数据库已经入库了(子线程事务提交)。
     这时候就可以采用 上面 1.7 的做法,子线程比主线程优先提交,但是即便这样也没法保证子线程的执行一定比回调快
 

3.  改进

    一般第三方的回调接口都有超时时间响应,他不希望你做任何的逻辑处理。只要接收到消息返回 success 即可。
    所以将消息的接受和业务逻辑处理分开,接受到回调后返回成功,同时异步处理业务逻辑。
    如果这个时候还没入库,把回调的唯一标识(订单号和回调参数)放到缓存。
    在子线程入库后也做类似的操作,查询缓存中的订单号是否存在(存在说明回调先到了),再获取回调参数,手动调用一次异步通知。
    当然这种还是有可能出现极端情况,就是 回调方法刚查询完,放缓存/子线程刚入库,获取缓存同时进行。导致缓存中还是存在订单号。
    这种极低概率的问题,可以间隔一段时间跑补偿程序(1h 一次)。
 

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

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

相关文章

Redis的过期策略和内存淘汰机制

过期策略 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时,我们自己可以指定缓存到期就失效。 如果假设你设置一个一批key只能存活1个小时,那么接下来1小时后,r…

[css] 如何更改placeholder的字体颜色和大小?

[css] 如何更改placeholder的字体颜色和大小&#xff1f; <style>/* Chrome浏览器 */input::-webkit-input-placeholder {color: red;}/* 火狐浏览器 */input::-moz-placeholder {color: red;}/* IE */input:-ms-input-placeholder {color: red;}</style> <body…

[maven] springboot将jar包打包到指定目录

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下springboot将jar包打包到指定目录下。 由于之前上线都是一个打包到一个jar&#xff0c;由于服务多了&#xff0c;1个包100多M&#xff0c;哪怕是小版本上线都需要重新上传jar包。 1.目的 将不常用的比如spring,druid等不常…

[css] 当一个元素被设置为浮动后,它的display值变为什么呢?

[css] 当一个元素被设置为浮动后&#xff0c;它的display值变为什么呢&#xff1f; 一个元素被设为绝对定位或者浮动后&#xff0c;其display计算值就变为了block&#xff0c;尽管其表现形式和inline-block类似——包裹内部元素且不超出包含块的特性。按照如下方式在控制台尝试…

Homebrew 安装使用

## Homebrew 安装使用> Homebrew是一款Mac OS平台下的软件包管理工具&#xff0c;拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令&#xff0c;就可以实现包管理&#xff0c;而不用你关心各种依赖和文件路径的情况&#xff0c;十分方便快捷。 #### 安装/…

[css] 为什么会出现浮动?在什么时候需要清除浮动呢?

[css] 为什么会出现浮动&#xff1f;在什么时候需要清除浮动呢&#xff1f; 因为在 div css 代替 table 布局之后&#xff0c;利用 float 很容易进行一些自适应的布局&#xff0c;比如双飞燕和圣杯布局。当然&#xff0c;float 原本的用途就是用来进行文字环绕图片的&#xf…

springboot启动后卡住 无日志的几种情况

大家好&#xff0c;我是烤鸭&#xff1a; 今天分享一下springboot启动后无日志的问题。 1.场景复现 springboot项目启动后卡住无日志&#xff0c;肯定是报错了或者其他原因&#xff0c;并且日志没有打印出来。 1.1 说一下比较通用常见的场景。 检查一下 是否 exc…

VMware下Centos7快速搭建vsftpd

最简单快捷的实现ftp的功能,不考虑安全问题. 1.配置防火墙和selinux vi /etc/selinux/config # This file controls the state of SELinux on the system. # SELINUX can take one of these three values: # enforcing - SELinux security policy is enforced. # per…

[css] 写出div在不固定高度的情况下水平垂直居中的方法?

[css] 写出div在不固定高度的情况下水平垂直居中的方法&#xff1f; 我知道的有两种方法<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style>* {padding: 0;margin: 0;}/* flex居中 …

hession调用json解析异常 com.caucho.hessian.io.HessianProtocolException: expected integer at 0x74 java.util

大家好&#xff0c;我是烤鸭&#xff1a; 采坑实录&#xff0c;使用hession报错 expected integer at 0x74 java.util.ArrayList。 1. 报错信息如下&#xff1a; 2020-03-18 14:27:48.057 [TID: N/A] [Apollo-RemoteConfigLongPollService-1] WARN [class:com.ctrip.fr…

[css] 移动端的布局用过媒体查询吗?写出例子看看

[css] 移动端的布局用过媒体查询吗&#xff1f;写出例子看看 media [type] and [condition] … not [condition] {… } media [condition] and/or/not [condition] … {… }其中&#xff1a;type "all" | "print" | "screen" | "speech&q…

Java通过cal.get(Calendar.MONTH)比真实月份少一个月

Calendar cal Calendar.getInstance();假如当前是12月&#xff0c;cal.get(cal.MONTH)是11月。 转载于:https://www.cnblogs.com/zhaogaojian/p/10050884.html

PMP读书笔记(第1章)

大家好&#xff0c;我是烤鸭&#xff1a;     今天做一个PMP的读书笔记。 第一章 引论1.1 概述指南和目的1.1.1 项目管理标准1.1.2 通用词汇1.1.3 道德与专业行为规范1.2 概述指南和目的1.2.1 项目1.2.2 项目管理的重要性1.2.3 项目、项目集、项目组合以及运营管理之间的关…

数据结构实验之图论六:村村通公路【Prim算法】(SDUT 3362)

题解&#xff1a;选点&#xff0c;选最小权的边&#xff0c;更新点权。可以手动自行找一遍怎么找到这个最小的生成树&#xff0c;随便选一个点放入我们选的集合中&#xff0c;然后看和这个点相连的点中&#xff0c;与那个点相连的那条边权值是最小的&#xff0c;选择之后&#…

[css] CSS的伪类和伪对象有什么不同?

[css] CSS的伪类和伪对象有什么不同&#xff1f; 伪类是给当前选中节点添加新样式&#xff0c; 伪对象是给当前选中节点添加伪元素。 伪类选择器使用&#xff1a;&#xff0c;伪对象选择器使用&#xff1a;&#xff1a;&#xff0c;因为兼容旧版&#xff0c;所以伪对象使用&am…

PMP读书笔记(第2章)

大家好&#xff0c;我是烤鸭&#xff1a;     今天做一个PMP的读书笔记。 第二章 项目运行环境2.1 概述2.2 事业环境因素2.2.1 组织内部的事业环境因素2.2.2 组织外部的事业环境因素2.3 组织过程资产2.3.1 过程、政策和程序2.3.2 组织知识库2.4 组织系统2.4.1 概述2.4.2 组…

[css] CSS的overflow属性定义溢出元素内容区的内容会如何处理呢

[css] CSS的overflow属性定义溢出元素内容区的内容会如何处理呢 visible&#xff08;默认值&#xff09;&#xff1a;溢出的内容会照常显示在元素内容区之外&#xff1b;hidden&#xff1a;溢出的内容会被裁剪&#xff1b;scroll&#xff1a;溢出的内容会出现在滚动区&#xff…

do文件的编写(转)

以前在使用ModelSim进行仿真的时候&#xff0c;一直是使用其GUI进行操作的&#xff0c;但是这样很繁琐也很费时。故希望学习其自动化仿真do文件&#xff0c;下面是学习的一些总结。 一、编写基本的do文件 下面按照实际仿真的步骤来说明do文件中需要用到的各个tcl命令。 1、quit…

PMP读书笔记(第3章)

大家好&#xff0c;我是烤鸭&#xff1a;     今天做一个PMP的读书笔记。 第三章 项目经理的角色3.1 概述3.2 项目经理的定义3.3 项目经理的影响力范围3.3.1 概述3.3.2 项目3.3.3 组织3.3.4 行业3.3.5 专业学科3.3.6 跨领域3.4 项目经理的能力3.4.1 概述3.4.2 技术项目管理…

PMP读书笔记(第4章)

大家好&#xff0c;我是烤鸭&#xff1a;     今天做一个PMP的读书笔记。 第四章 项目整合管理概述项目整合管理的核心概念项目整合管理的发展趋势和新兴实践裁剪时需要考虑的因素在敏捷或适应型环境中需要考虑的因素4.1 制定项目章程4.1.1 制定项目章程&#xff1a;输入4.…