在spring事务中扩展业务操作;spring事务同步器TransactionSynchronizationManager

概述

业务上经常会有一些需求是需要在某个数据库操作事务提交之后再去操作。

我常用的就方式有@TransactionalEventListenerTransactionSynchronizationManager.

其实@TransactionalEventListener背后使用的也是TransactionSynchronizationManager

注意点:在afterCompletion方法中已经脱离当前事务了,如果想确保其中的方法也在一个事务中,那么就需要开启一个新事务.
在使用 >= spring 5.2是可以用org.springframework.transaction.support.TransactionTemplate#execute方法,里面会新开启一个事务。在小于上述版本时,可以手动开启事务来控制.

使用demo

//fallbackExecution = true代表没有事务的时候也监听
@TransactionalEventListener(value = {xxx.class}, fallbackExecution = true)
@Order(Ordered.HIGHEST_PRECEDENCE)
public void onApplicationEvent(xxx event) {

    log.info("监听成功,xxxxxx");
	//xxxxx

}

TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
            @Override
            public void afterCompletion(int status) {
                switch (status) {
                    case 0:
                        // 外部方法事务提交后执行的业务逻辑
                        break;
                    case 1:
                        // 外部方法事务回滚后执行的业务逻辑
                        break;
                    case 2:
                        // 外部方法事务异常时执行的业务逻辑
                        break;
                }
                TransactionSynchronization.super.afterCompletion(status);
            }
        });

TransactionSynchronizationManager(事务同步器)分析

平时使用的时候都是直接用注解@Transactional,一般也知道是spring aop帮我们开启了事务,其中aop拦截使用事务注解的方法后使用的就是TransactionSynchronizationManager.

我用的是mybatis-spring-2.0.7,就从mybtais获取connection来入手了

org.mybatis.spring.transaction.SpringManagedTransaction#openConnection在从连接池获取connection的时候会判断是否开启了事务,如果已开启,那么会将连接暂时绑定到事务同步管理器中.

所谓的绑定其实就是塞到了一个threadLocal中和当前线程进行了一个关联。

业务中对事务的扩展方法通常都是在TransactionSynchronization的方法中执行的.

org.springframework.transaction.support.AbstractPlatformTransactionManager#triggerAfterCompletion中可以看到会将所有之前注册的同步事务操作按照List中的顺序(注册顺序)依次调用.

最后在org.springframework.transaction.support.AbstractPlatformTransactionManager#processCommit中的finally中可以看到对各项资源进行了释放,意味着我们仍旧可以在这之前拿到connection连接进行操作db

获取连接绑定connection给TransactionSynchronizationManager
在这里插入图片描述

TransactionSynchronization 扩展点

public interface TransactionSynchronization extends Ordered, Flushable {

    /** Completion status in case of proper commit. */
    // 事务提交状态
    int STATUS_COMMITTED = 0;

    /** Completion status in case of proper rollback. */
    // 事务回滚状态
    int STATUS_ROLLED_BACK = 1;

    /** Completion status in case of heuristic mixed completion or system errors. */
    // 事务异常状态
    int STATUS_UNKNOWN = 2;

    /**
     * 当前事务挂起时触发
     * Supposed to unbind resources from TransactionSynchronizationManager if managing any.
     * @see org.springframework.transaction.reactive.TransactionSynchronizationManager#unbindResource
     */
    default void suspend() {
    }

    /**
     * 当前事务恢复时触发(结束挂起时)
     * Supposed to rebind resources to TransactionSynchronizationManager if managing any.
     * @see org.springframework.transaction.reactive.TransactionSynchronizationManager#bindResource
     */
    default void resume() {
    }

    /**
     * 当前事务刷新时触发
     * 将基础会话刷新到数据存储区(如果适用),比如Hibernate/JPA的Session
     * @see org.springframework.transaction.TransactionStatus#flush
     */
    @Override
    default void flush() {
    }

    /**
     * 当前事务提交前触发,此处若发生异常,会导致回滚。
     * @see #beforeCompletion
     */
    default void beforeCommit(boolean readOnly) {
    }

    /**
     * 当前事务完成前触发。
     * 在beforeCommit之后,commit/rollback之前执行。即使异常,也不会回滚。
     * @see #beforeCommit
     * @see #afterCompletion
     */
    default void beforeCompletion() {
    }

    /**
     * 当前事务提交后触发
     */
    default void afterCommit() {
    }

    /**
     * 当前事务完成后触发
     * 通过status的value指定具体的触发时机(即上面的三个属性)
     */
    default void afterCompletion(int status) {
    }
}

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

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

相关文章

【人工智能】人工智能和双曲几何

一、说明 作为人工智能技术的理论支撑,几何学是必不可少的;目前直接的几何技术有:计算几何--对集合体如点云处理有用;射影几何--对3d重构有用;双曲几何--在自然语言的词嵌入做基础数学模型,另外深度学习国外有双曲网络在应用。本文针对双曲几何进行探讨。 二、各种几何的…

[CKA]考试之四层负载均衡service

由于最新的CKA考试改版,不允许存储书签,本博客致力怎么一步步从官网把答案找到,如何修改把题做对,下面开始我们的 CKA之旅 题目为: Task 重新配置一个已经存在的front-end的deployment,在名字为nginx的容…

gitTortoise图形化工具下载步骤

一,简介 本文主要介绍如何下载安装gitTortoise图形化工具来管理和提交代码。 二,步骤介绍 2.1 安装包下载 下载地址:https://download.tortoisegit.org/tgit/ 打开后,界面如下: 点击选择最新的稳定release版本&am…

【Unity3D】雾效

1 前言 屏幕深度和法线纹理简介中对深度和法线纹理的来源、使用及推导过程进行了讲解,激光雷达特效中讲述了一种重构屏幕像素点世界坐标的方法,本文将介绍使用深度纹理重构屏幕像素点在相机坐标系下的坐标计算方法,并使用重构后的坐标模拟雾…

驱动开发:基于事件同步的反向通信

在之前的文章中LyShark一直都在教大家如何让驱动程序与应用层进行正向通信,而在某些时候我们不仅仅只需要正向通信,也需要反向通信,例如杀毒软件如果驱动程序拦截到恶意操作则必须将这个请求动态的转发到应用层以此来通知用户,而这…

多模态学习

什么是多模态学习? 模态 模态是指一些表达或感知事物的方式,每一种信息的来源或者形式,都可以称为一种模态 视频图像文本音频 多模态 多模态即是从多个模态表达或感知事物 多模态学习 从多种模态的数据中学习并且提升自身的算法 多…

Nacos架构与原理 - 寻址机制

文章目录 前提设计MemberLookup内部实现单机寻址 StandaloneMemberLookup文件寻址 FileConfigMemberLookup地址服务器寻址 AddressServerMemberLookup 未来可扩展点 前提 Nacos 支持单机部署以及集群部署 针对单机模式,Nacos 只是自己和自己通信;对于集…

关系数据库SQL数据查询

关系数据库SQL数据查询 数据查询 一、单表查询 1.查询仅涉及一个表,选择表中的若干列 [例1] 查询全体学生的学号与姓名。SELECT Sno,SnameFROM Student; [例2] 查询全体学生的姓名、学号、所在系。SELECT Sname,Sno,SdeptFROM Student;查询全部列 选出所有属…

文件系统考古 3:1994 - The SGI XFS Filesystem

在 1994 年,论文《XFS 文件系统的可扩展性》发表了。自 1984 年以来,计算机的发展速度变得更快,存储容量也增加了。值得注意的是,在这个时期出现了更多配备多个 CPU 的计算机,并且存储容量已经达到了 TB 级别。对于这些…

机器学习实践(1.2)XGBoost回归任务

前言 XGBoost属于Boosting集成学习模型,由华盛顿大学陈天齐博士提出,因在机器学习挑战赛中大放异彩而被业界所熟知。相比越来越流行的深度神经网络,XGBoost能更好的处理表格数据,并具有更强的可解释性,还具有易于调参…

SpringCloud微服务(二)网关GateWay、Docker、Dockerfile、Linux操作超详细

目录 统一网关GateWay 搭建网关服务的步骤 1、引入依赖 2、编写路由配置及nacos地址 路由断言工厂Route Oredicate Factory 路由过滤器配置 全局过滤器GlobalFilter 过滤器执行顺序 跨域问题处理 Docker ​编辑 Docker与虚拟机 镜像和容器 Docker的安装 启动docke…

MSP432学习笔记11:定时器A的结构\基地址\函数汇总理解

今日得以继续我的电赛MSP432学习之路:所用开发板MSP432P401R 定时器是任何单片机开发板十分重要的模块,在几日的学习使用过程中,本人也对其使用原理等产生过许多疑问,他究竟是怎么存储计数值、捕获值的?一个定时器四个…

8.2 电压比较器(1)

电压比较器是对输入信号进行鉴幅与比较的电路,是组成非正弦波发生电路的基本单元电路,在测量和控制中有着相当广泛的应用。 一、概述 1、电压比较器的电压传输特性 电压比较器的输出电压 u O u_{\scriptscriptstyle O} uO​ 与输入电压 u I u_{\scr…

网络层:虚拟专用网VPN和网络地址转换NAT

1.网络层:虚拟专用网VPN和网络地址转换NAT 笔记来源: 湖科大教书匠:虚拟专用网VPN和网络地址转换NAT 声明:该学习笔记来自湖科大教书匠,笔记仅做学习参考 1.1 虚拟专用网VPN 专用网和公用网的特点 专用网络&#xff…

Springboot集成magic-api

目录 1、前言 2、springboot集成magic-api 2.1、添加maven依赖 2.2、application.yml配置 2.3、编写测试接口 2.4、启动程序,访问接口 2.5、magic-api脚本 3、magic-api其他语法 4、注意事项 1、前言 今天项目中遇到一个问题,springboot后端项目…

探索ChatGPT:了解语言模型在对话系统中的应用

第一章:引言 在当今数字化时代,人工智能技术的迅猛发展使得对话系统成为一个备受关注的领域。随着语言模型的进步,像ChatGPT这样的模型正在改变我们与计算机进行交流的方式。本文将探索ChatGPT作为一种语言模型在对话系统中的应用&#xff0…

简化 Hello World:Java 新写法要来了

OpenJDK 的 JEP 445 提案正在努力简化 Java 的入门难度。 这个提案主要是引入 “灵活的 Main 方法和匿名 Main 类” ,希望 Java 的学习过程能更平滑,让学生和初学者能更好地接受 Java 。 提案的作者 Ron Pressler 解释:现在的 Java 语言非常…

Flutter 笔记 | Flutter 核心原理(三)布局(Layout )过程

布局过程 Layout(布局)过程主要是确定每一个组件的布局信息(大小和位置),Flutter 的布局过程如下: 父节点向子节点传递约束(constraints)信息,限制子节点的最大和最小宽…

【实战与杂谈】本地搭建自己的游戏王卡片生成器

声明: 1.游戏王卡片制作器本身就是由【kooriookami】开发的,用于DIY卡片因此我只是原有功能再现并不会追加新功能 2.其次数据和卡图均来源于网络,因此我也只提供网络能获取该内容的途径,并不会预先准备好 最近一直没有时间看回复…

SpringBoot的配置环境属性

SpringBoot的配置环境属性 在本文中,我们将讨论SpringBoot的配置环境属性。我们将了解如何使用这些属性来配置我们的应用程序,以便在不同的环境中运行。我们还将了解如何使用SpringBoot的配置文件来管理这些属性。最后,我们将介绍一些最佳实…
最新文章