Java中Transactional在不同方法间的穿透性,rollbackFor参数含义

哈喽,大家好,我是木头左!
在Java开发中,经常会遇到需要在一个事务中执行多个操作的场景。为了确保这些操作的原子性,可以使用Spring框架提供的@Transactional注解来实现事务管理。然而,在实际开发过程中,可能会遇到一个问题:@Transactional注解在不同的方法之间是否具有穿透性?另外,rollbackFor参数又有什么含义呢?本文将针对这两个问题进行详细的探讨。

1. @Transactional注解在不同方法间的穿透性

来看一下@Transactional注解在不同方法间是否具有穿透性。答案是:具有穿透性。

当在一个类的方法上添加了@Transactional注解后,这个注解会对该类的所有方法生效。这意味着,在同一个事务中,如果一个方法调用了另一个被@Transactional注解修饰的方法,那么这两个方法都会在同一个事务中执行。这就是@Transactional注解在不同方法间的穿透性。

下面是一个简单的示例:

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Transactional(rollbackFor = Exception.class)
    public void methodA() throws Exception {
        userDao.insert(new User("张三"));
        int i = 1 / 0; // 故意抛出异常,触发事务回滚
        userDao.update(new User("李四"));
    }

    @Transactional(rollbackFor = Exception.class)
    public void methodB() throws Exception {
        userDao.insert(new User("王五"));
        userDao.update(new User("赵六"));
    }
}

在这个示例中,在UserService类的两个方法上都添加了@Transactional注解。当调用methodA()时,它会先执行插入操作,然后抛出异常,最后执行更新操作。由于这两个操作都在同一个事务中,所以当异常发生时,整个事务会被回滚,即插入和更新操作都不会生效。同样,当调用methodB()时,它也会在同一个事务中执行插入和更新操作。

2. rollbackFor参数含义

接下来,来看一下rollbackFor参数的含义。在Spring的事务管理中,rollbackFor参数用于指定哪些异常会导致事务回滚。默认情况下,只有RuntimeException及其子类的异常才会触发事务回滚。但是,通过设置rollbackFor参数,可以自定义需要回滚的异常类型。

下面是一个简单的示例:

@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    @Transactional(rollbackFor = Exception.class) // 设置rollbackFor参数为Exception.class,表示所有类型的异常都会触发事务回滚
    public void methodA() throws Exception {
        userDao.insert(new User("张三"));
        int i = 1 / 0; // 故意抛出异常,触发事务回滚
        userDao.update(new User("李四"));
    }
}

在这个示例中,将rollbackFor参数设置为Exception.class。这意味着,无论抛出何种类型的异常,只要在同一个事务中,事务都会被回滚。需要注意的是,这样做可能会导致不必要的性能开销,因为很多非业务异常(如I/O异常、数据库连接异常等)也会导致事务回滚。因此,在实际开发中,应该根据实际情况合理设置rollbackFor参数。

3. 总结

通过对@Transactional注解在不同方法间的穿透性和rollbackFor参数含义的探讨,可以得出以下结论:

  • @Transactional注解在不同方法间具有穿透性,即同一个事务中的方法都会受到该注解的影响;
  • rollbackFor参数用于指定哪些异常会导致事务回滚,可以自定义需要回滚的异常类型;
  • 在实际开发中,应该根据实际情况合理设置rollbackFor参数,避免不必要的性能开销。

我是木头左,感谢各位童鞋的点赞、收藏,我们下期更精彩!

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

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

相关文章

CVE-2012-2122-mysql未授权访问漏洞复现-vulhub

1.原理 参考:CVE-2012-2122 Mysql身份认证漏洞及利用-CSDN博客 简单来说,除了配置上的问题以外,是密码的验证出现了漏洞,导致尝试次数多了之后直接可以登入 使用:kalivulhub 2.复现 开一下镜像,用的是v…

代码随想录算法训练营第五十八天 | 392.判断子序列

392.判断子序列 题目链接:代码随想录 视频讲解:动态规划,用相似思路解决复杂问题 | LeetCode:392.判断子序列_哔哩哔哩_bilibili 解题思路 本题和求最长公共子序列是一样的,值就是s字符串的长度,如果一致…

拥抱开源,构建未来:王嘉树与 TDengine 的开源之旅

在当代的技术浪潮中,开源文化不仅催生了无数创新技术,也为广大技术爱好者提供了一个展示才华、相互学习的平台。我们今天采访到的这位北京邮电大学电子工程学院的研究生,就是在这样的背景下,通过开源活动不断探索、学习并实现自我…

C++中extern “C“的用法

目的 extern "C"是经常用到的东西,面试题目也经常出现,然则,实际用时,还是经常遗忘,因此,深入的了解一下,以增强记忆。 extern "C"指令非常有用,因为C和C的近亲…

python -- 异步、asyncio

文章目录 协程实现协成的方法greenlet实现协程yield 关键字asyncio async & await(**重点**) 协程的意义异步编程事件循环快速上手awaitTask对象asyncio.Future对象concurrent.futures.Future 对象 协程 协成不是操作系统提供的,是程序员…

LLM-不要错过,教你如何快速且精准生成提示词?(总结Singapore首届GPT-4提示工程获奖者Sheila Teo博客)

文章目录 前置理论精炼介绍1. CO-STAR框架CO-STAR框架简单介绍CO-STAR简单示例 2. 创建系统提示【优化LLM问答丰富度】何为系统提示?系统提示示例 3. 使用分隔符分段提示【优化问答准度】分割符作特殊字符及CO-STAR示例分割符作XML标记 仅数据的CO-STAR实操前置分析…

如何用西语问候呢,柯桥零基础西班牙语培训

正式问候 在正式场合,如工作会议、正式介绍或第一次见面时,通常使用更为尊敬和礼貌的问候语。以下是一些例子: 1. Buenos das(早上好):从早上到中午使用。这是一个非常常见和礼貌的问候。 2. Buenas tardes(下午好):…

HTML静态网页成品作业(HTML+CSS)—— 节日母亲节介绍网页(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…

2024年3月电子学会青少年软件编程 中小学生Python编程等级考试二级真题解析(判断题)

2024年3月Python编程等级考试二级真题解析 判断题(共10题,每题2分,共20分) 26、元组中的元素可以是不同的数据类型 答案:对 考点分析:考查元元组相关知识,元组里面的元素是可以出现不同的数据…

流程设计的基本步骤

背景 公司为什么要流程,已经有专门章节进行阐述; 什么是流程,已经有专门章节进行专门阐述; 那么接下来这个章节讨论,流程设计的基本步骤,那么谁来设计流程呢,让一个部门的员工来设计一份流程…

30字以内免费翻译维吾尔语,汉维翻译工具推荐,维吾尔文字母OCR识别神器《维汉翻译通》App!

维吾尔文OCR文字识别 《维汉翻译通》App内置的OCR技术,能够快速识别图片中的文字和字母,无论是路标、菜单还是书籍,都能迅速转换为用户所需的语言,让语言障碍不再是问题。针对维吾尔语更是进行了专门的优化,即便是手写…

vue3+electron搭建桌面软件

vue3electron开发桌面软件 最近有个小项目, 客户希望像打开 网易云音乐 那么简单的运行起来系统. 前端用 Vue 会比较快一些, 因此决定使用 electron 结合 Vue3 的方式来完成该项目. 然而, 在实施过程中发现没有完整的博客能够记录从创建到打包的流程, 摸索一番之后, 随即梳理…

Android 14 系统启动流程 之 启动init进程、启动Zygote进程

Android 14 系统启动流程 之 启动init进程、启动Zygote进程 废话不多说,先上图,不清楚的可以在评论区留言。

C#下WinForm多语种切换

这是应一个网友要求写的,希望对你有所帮助。本文将介绍如何在一个WinForm应用程序中实现多语种切换。通过一个简单的示例,你将了解到如何使用资源文件管理不同语言的文本,并通过用户界面实现语言切换。 创建WinForm项目 打开Visual Studio&a…

ACL原理和基础配置

ACL(Access Control List,访问控制列表)是一种用于控制网络设备或操作系统上资源访问权限的方法。ACL能够基于规则和条件来允许或拒绝对资源的访问。 标准ACL(Standard ACL):基于源IP地址来进行流量过滤&a…

实现一个vue js小算法 选择不同的时间段 不交叉

以上图片选择了时间段 现在需要判断 当前选择的时间段 不能够是 有交叉的所以现在需要循环判断 //判断时间段是否重叠交叉 export function areIntervalsNonOverlapping(intervals:any) {// 辅助函数:将时间字符串转换为从当天午夜开始计算的分钟数function conver…

视频格式转换avi格式怎么弄?分享视频转换方法

视频格式转换avi格式怎么弄?AVI作为一种广泛支持的视频格式,能够在多种设备和播放器上顺畅播放,确保我们的视频内容能够无障碍地分享给朋友或上传至各大平台。其次,AVI格式通常具有较好的兼容性,能够避免格式转换过程中…

Coursera耶鲁大学金融课程:Financial Markets 笔记Week 01

Financial Markets 本文是学习 https://www.coursera.org/learn/financial-markets-global这门课的学习笔记 这门课的老师是耶鲁大学的Robert Shiller https://en.wikipedia.org/wiki/Robert_J._Shiller Robert James Shiller (born March 29, 1946)[4] is an American econ…

React+TS前台项目实战(七)-- 全局常用组件Select封装

文章目录 前言Select组件1. 功能分析2. 代码详细注释说明3. 使用方式4. 效果展示(1)鼠标移入效果(2)下拉框打开效果(3)回调输出 总结 前言 今天这篇主要讲全局select组件封装,可根据UI设计师要…

力扣148. 排序链表

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3&…