Spring @Transactional注解事务六大失效场景

news2024/11/16 20:33:46

82415ba718dee871bed44fc8396718b8.png

@Transactional事务失效场景1:注解在非public修饰的方法上。

原因:Spring强制的要求。

代码示例:

@Transactional
    private void createOrder(){


    }

@Transactional事务失效场景2:注解在被final关键字修饰的方法上。

原因:Spring的@Transactional注解事务是通过生成一个代理子类,通过重写父类方法方式实现事务的代理增强,被final关键字修饰的方法由于不能被子类重写,所以不能通过代理增强。

代码示例:

@Transactional
    public final void createOrder(){
        
    }

@Transactional事务失效场景3:通过this调用方法

原因:这个跟第2个场景类似,由于this这个关键字在jvm中指当前类对象,而不是spring代理后的代理对象,所以不具备事务增强能力。

代理示例:

public void methodA(){
        //methodB方法如果抛出异常,事务不会回滚
        this.methodB();
    }


    @Transactional
    public void methodB(){


    }

@Transactional事务失效场景4:异常被try捕获。

原因:Spring事务默认只会回滚抛出RuntimeException类型异常,如果异常被try,那么事务就不会回滚。

代码示例:

@Transactional
    public void method() {
        try {
            //business logic process
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

@Transactional事务失效场景5:抛出非RuntimeException类型异常且没有指定rollbackFor。

原因:Spring 注解事务在没有手动指定rollbackFor参数的情况下,默认只会回滚抛出RuntimeException类型异常,可以通过手动指定rollbackFor参数来改变这个策略。

代码示例:

//不会回滚
    @Transactional
    public void methodA() throws Exception {
        try {
            //business logic process
        } catch (Exception e) {
            throw new Exception("抛出非RuntimeException类型异常");
        }
    }


    //会回滚
    @Transactional(rollbackFor = Exception.class)
    public void methodB() throws Exception {
        try {
            //business logic process
        } catch (Exception e) {
            throw new Exception("抛出非RuntimeException类型异常");
        }
    }

@Transactional事务失效场景6:新开线程处理。

原因:Spring事务管理器底层是通过ThreadLocal的原理来管理事务的,无法控制跨线程之间的事务一致性。

示例代码:

//线程内部抛出异常,事务均不会回滚
    @Transactional
    public void methodA(){
        //insert into xxx
        new Thread(new Runnable() {
            @Override
            public void run() {
                // insert into xxx
                // update xxx
                // throw new RuntimeException
            }
        });
    }
---------- 正文结束 ----------
长按扫码关注微信公众号

Java软件编程之家

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

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

相关文章

推荐一款好用的设备维护管理系统,你用过了吗

设备维护管理系统层出不穷,找到一款好用的适配的,也要花费大量的时间去挑选! 对于企业来说,一个好的设备管理系统应该能够: 1. 适应企业高度场景化的设备管理工作,覆盖设备的采购、常规检查、养护、添装、…

“三刷”牛客网844道Java题目,易错知识点总结,带你清扫Java基础面试障碍

目录 前言 1、子类通过哪些办法,可以调用继承自父类的方法? 2、volatile、Lock、transient 哪个关键字不能用来处理线程安全 3、Hashtable 和 HashMap 的区别是?(容易忽略的两点) 4、如何声明了一个适合于创建50个字…

flask框架实现文件下载接口

方式一: app.route("/download1") def download():# return send_file(test.exe, as_attachmentTrue)return send_file(2.jpg)# return send_file(1.mp3)如果不加as_attachment参数,则会向浏览器发送文件,比如发送一张图片&#x…

Revit技巧:快速隔离一个小构件,拉伸屋顶转折处连接

一、Revit中如何快速单独隔离一个小构件 今天跟大家分享的是一个快速隔离的小技巧,你可以理解为快速用剖面框拉成你需要的构件区域。我就举个例子让大家简单容易理解,如图1所示,假设我只需要编辑那个墙的装饰,但又需要用剖面框&am…

704二分查找法--搜索区间

二分查找法–搜索区间的深入理解 二分查找法是算法学习中很基础的算法&#xff0c;但是其也是很重要的算法&#xff0c;将二分查找法搞明白对后续算法的学习有着事半功倍的作用。 本体难点&#xff1a;二分搜索区间的判断 搜索区间 [left,right] int search(vector<int>…

026_SS_MoFusion A Framework for Denoising-Diffusion-based Motion Synthesis

MoFusion: A Framework for Denoising-Diffusion-based Motion Synthesis 本文提出了一种利用diffusion生成人体motion的方法。这种方法可以将音频和文本作为条件。 损失函数 对于diffusion的损失中&#xff0c;加入了运动损失。 其中第一项 LdaL_{da}Lda​ 是原始的diffusio…

微信公众号如何接入ChatGPT机器人

不难&#xff0c;代码总共也就25行&#xff0c;大致逻辑如下。 总共分为是下面两步 文章目录在云服务器上部署自定义消息处理服务微信公众号配置自己的消息处理服务器在云服务器上部署自定义消息处理服务 这里需要我们自定义来处理用户发送过来的消息 首先导入werobot&#x…

Linux操作系统实验2——进程描述

实验要求&#xff1a; 1.查看task_struct的结构&#xff0c;找到其中的pid&#xff0c;state&#xff0c;prio&#xff0c;parent pid字段 2.在task_struct结构中找到vma相关字段&#xff0c;vm_start,vm_end,vm_next 3.打印指定pid的基本信息&#xff0c;包括基本信息及VMA内存…

分组卷积与dw卷积

分组卷积&#xff08;Group Convolution&#xff09; 分组卷积在ResNext中用到了 首先必须明确&#xff1a; 常规卷积&#xff08;Convolution&#xff09;的参数量是&#xff1a; K*K*C_in*n K是卷积核大小&#xff0c;C_in是input的channel数&#xff0c;n是卷积核个数(outp…

共享模型之管程(一)

1.共享带来的问题 1.1.线程安全问题 例如: 两个线程对初始值为0的静态变量一个做自增,一个做自减,各做5000次,结果是0吗? Slf4j public class TestThread {//静态共享变量static int counter 0;public static void main(String[] args) throws InterruptedException {Threa…

【Axure教程】拖动排序——扣款顺序

随着移动支付的发展&#xff0c;移动支付的途径和方式也越来越多&#xff0c;常见的有钱包余额支付、支付宝支付、微信支付、银行卡支付……随着绑定的账户越来越多&#xff0c;我们需要一个设置扣款顺序的功能页面。 所以今天作者就教大家如果做一个拖动排序的扣款顺序的原型…

机器学习的4种经典模型总结

机器学习&#xff08;Machine Learning&#xff09;是人工智能的一个分支&#xff0c;也是人工智能的一种实现方法。机器学习的核心是“使用算法解析数据&#xff0c;从中学习&#xff0c;然后对新数据做出决定或预测”&#xff0c;机器学习的概念就是通过输入海量训练数据对模…

【财务】FMS财务管理系统---质保金与预付款

在FMS财务管理系统中&#xff0c;如何对质保金和预付款进行管理&#xff0c;笔者做了详细的业务流程拆解。 上一篇主要说了财务应收管理&#xff0c;有一些朋友留言提出了很多建议&#xff0c;在这里必须谢谢。 关于应收分为ToC与ToB两部分&#xff0c;每一部分都与前端业务系…

新一代自动出价范式:在线强化学习SORL框架

丨目录&#xff1a; 摘要 动机&#xff1a;在离线不一致问题 问题建模 方法&#xff1a;SORL框架 实验结果 总结 关于我们 参考文献▐ 摘要近年来&#xff0c;自动出价已成为广告主提升投放效果的重要方式&#xff0c;在真实广告系统&#xff08;RAS&#xff09;中&#xff0c;…

C++ 数学与算法系列之高斯消元法求解线性方程组

1. 前言 什么是消元法&#xff1f; 消元法是指将多个方程式组成的方程组中的若干个变量通过有限次地变换&#xff0c;消去方程式中的变量&#xff0c;通过简化方程式&#xff0c;从而获取结果的一种解题方法。 消元法主要有代入消元法、加减消元法、整体消元法、换元消元法、…

【C/C++ SOCKET编程】实现服务器客户端的简单通信

什么是SOCKET Socket又称"套接字"&#xff0c;应用程序通常通过"套接字"向网络发出请求或者应答网络请求&#xff0c;使主机间或者一台计算机上的进程间可以通讯。 TCP/IP协议 从字面意义上讲&#xff0c;有人可能会认为 TCP/IP 是指 TCP 和 IP 两种协议…

Hive环境安装搭建

目录 Hive安装 MySQL安装 配置Hive元数据库到MySQL Hive安装 软件包 0积分免费下载&#xff1a; hive环境安装所需软件包-Hive文档类资源-CSDN下载 将软件包拖进虚拟机中 将jar包解压到目录 给目录文件夹名改为hive 配置环境变量 输入命令&#xff1a; vim /etc/profile …

数据滚动大屏:Stimulsoft Dashboards.WIN 2023.1.2

Stimulsoft Dashboards.WIN 是一组组件&#xff0c;您可以使用这些组件将分析添加到您的应用程序中。WinForms 和 WPF 的仪表板 Stimulsoft Dashboards.WIN 是一个功能齐全的工具&#xff0c;用于在仪表板上转换、分析、分组、过滤、排序和显示数据。它与 .NET Framework 4.5 及…

科创板智能家居第一股,萤石网络昨日上市

2022年12月28日&#xff0c;杭州萤石网络股份有限公司(以下简称“萤石网络”)成功登陆上海证券交易所科创板&#xff0c;证券代码为688475。值得一提的是&#xff0c;萤石网络是登陆科创板的第500家企业。 在上市仪式上&#xff0c;萤石网络董事长、总经理蒋海青表示&#xff0…

医药信息咨询公司排名TOP10是怎么进行收费的?

随着我国医药行业的飞速发展&#xff0c;市场竞争也是越发的激烈&#xff0c;作为产业链中的医药信息咨询公司作用也愈加明显&#xff0c;医药信息咨询公司以提供医药行业的战略咨询、项目尽调、产品立项评估、行业赛道/细分市场机会评估、专利服务、新产品上市服务、新药产品特…