当前位置: 首页 > news >正文

详解:事务注解 @Transactional

创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家!


@Transactional Spring Framework 中常用的注解之一,它可以被用于管理事务。通过使用这个注
解,我们可以方便地管理事务,保证数据的一致性和完整性。
Spring 应用中,当我们需要对数据库进行操作时,通常需要使用事务来保证数据的一致性和完整
性。
@Transactional 注解可以被用于类或方法上,用于指定事务的管理方式。当它被用于类上时,它表示
该类中所有的方法都将被包含在同一个事务中。当它被用于方法上时,它表示该方法将被包含在一个新
的事务中。
@Transactional 注解有多个属性,其中最常用的是 propagation isolation
propagation 属性用于指定事务的传播行为,它决定了当前方法执行时,如何处理已经存在的事务
isolation 属性用于指定事务的隔离级别,它决定了当前事务与其他事务之间的隔离程度。
除了 propagation isolation 属性外, @Transactional 还支持其他属性,如 readOnly timeout
rollbackFor noRollbackFor 等,这些属性可以用于进一步细化事务的行为。
总之, @Transactional 注解是 Spring 应用中常用的事务管理注解。
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public DataSource dataSource () {
// 配置数据源
}
@Bean
public JdbcTemplate jdbcTemplate () {
return new JdbcTemplate ( dataSource ());
}
@Bean
public PlatformTransactionManager transactionManager () {
return new DataSourceTransactionManager ( dataSource ());
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 @Tranasctional 注解的使用注意事项
@Tranasctional 注解是 Spring 框架提供的声明式注解事务解决方案,在使用 @Transactional 注解时需
要注意以下问题 :
1. @Transactional 注解只能用在 public 方法上,如果用在 protected 或者 private 的方法上,不会报
错,但是该注解不会生效。
2. 默认情况下, @Transactional 注解只能回滚 非检查型异常,具体为 RuntimeException 及其子类和
Error 子类
非检查型异常指( Unchecked Exception )的是程序在编译时不会提示需要处理该异常,而
是在运行时才会出现异常。在 Java 中,非检查型异常指的是继承自 RuntimeException
的异常,例如 NullPointerException ArrayIndexOutOfBoundsException 等。这些异常通
常是由程序员的代码错误引起的,因此应该尽可能避免它们的发生,但是在代码中并不需要
显式地处理它们。
检查型异常( Checked Exception )是指在 Java 中,编译器会强制要求对可能会抛出这些异
常的代码进行异常处理,否则代码将无法通过编译。这些异常包括 IOException
SQLException 等等,它们通常表示一些外部因素导致的异常情况,比如文件读写错误、数
据库连接失败等等。
在编写代码时应该尽量避免抛出非检查型异常,因为这些异常的发生通常意味着程序存在严
重的逻辑问题。
默认情况下, @Transactional 注解只能回滚 非检查型异常,为啥呢 ?
可以从 Spring 源码的 DefaultTransactionAttribute 类里找到判断方法 rollbackOn
3. 如果需要对检查型异常( Checked Exception )进行回滚,可以使用 rollbackFor 属性来定义回滚
的异常类型,使用 propagation 属性定义事务的传播行为。
下面是一个例子:
上面的例子中 : 指定了回滚 Exception 类的异常为 Exception 类型或者其子类型检查型异常( Checked
Exception ),另外,配置类事务的传播行为支持当前事务,当前如果没有事务,那么会创建一个事
务。
4. @Transactional 注解不能回滚被 try{}catch() 捕获的异常。
5. @Transactional 注解只能对在被 Spring 容器扫描到的类下的方法生效。
其实 Spring 事务的创建也是有一定的规则,对于一个方法里已经存在的事务, Spring 也提供了解决方案
去进一步处理存在事务,通过设置 @Tranasctional propagation 属性定义 Spring 事务的传播规则。
Spring 事务的传播规则
Spring 事务的传播规则是指在多个事务方法相互调用的情况下,事务应该如何进行传播和管理。
Spring 事务的传播行为一共有 7 种,定义在 spring-tx 模块的 Propagation 枚举类里,对应的常量值定义
TransactionDefinition 接口里 , 值为 int 类型的 0-6
@Override
public boolean rollbackOn ( Throwable ex ) {
return ( ex instanceof RuntimeException || ex instanceof Error );
}
1
2
3
4
@Transactional ( rollbackFor = Exception . class , propagation =
Propagation . REQUIRED )
1 PROPAGATION_REQUIRED
支持当前事务,如果当前没有事务,则创建一个事务,这
是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务来执行
PROPAGATION_MANDATORY
支持当前事务,如果没有当前事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
以非事务执行操作,如果当前存在事务,则当前事务挂
起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有
事务,则进行与 PROPAGATION_REQUIRED 类似的操作。
稍后一点,结合源码介绍。

相关文章:

详解:事务注解 @Transactional

创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家! Transactional 是 Spring Framework 中常用的注解之一,它可以被用于管理事务。通过使…...

【虚拟仪器技术】labview操作指南和虚拟仪器技术习题答案(一)

今天是2025年2月24日,画的是fate/Grand Order里面的阿尔托莉雅.卡斯特,武内老师的画。 目录 第1章 第2章 第3章 第4章 第5章 关注作者了解更多 我的其他CSDN专栏 毕业设计 求职面试 大学英语 过程控制系统 工程测试技术 虚拟仪器技术 可编程…...

在Linux桌面上创建Idea启动快捷方式

1、在桌面新建idea.desktop vim idea.desktop [Desktop Entry] EncodingUTF-8 NameIntelliJ IDEA CommentIntelliJ IDEA Exec/home/software/idea-2021/bin/idea.sh Icon/home/software/idea-2021/bin/idea.svg Terminalfalse TypeApplication CategoriesApplication;Developm…...

渗透测试(WAF过滤information_schema库的绕过,sqllib-46关,海洋cms9版本的注入)

1.sqlin-lib 46关 打开网站配置文件发现 此网站的对ID进行了排序,我们可以知道,order by接不了union ,那我们可以通过测试sort,rond等函数,观察网页的反馈来判断我们的盲注是否正确 我们发现 当参数有sort来排序时&…...

Unity基础——资源导出分享为Unity Package

一.选中要打包的文件夹,右击,点击Exporting package 二.勾选 Include Dependencies,点击Export Include Dependencies:代表是否包含资源依赖的选项 三.选择保存的位置,即可生成Unity package 最终形成文件&#xff1a…...

C语言【指针篇】(三)

C语言【指针篇】(三) 前言正文1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 总结 前言 本文主要基于前面对指针的掌握,进一步学习:数组名的理解、使用指针…...

DevSecOps普及:安全与开发运维的深度融合

一、引言 随着软件开发模式的演进,DevOps已成为现代软件工程的主流实践。然而,在传统的DevOps流程中,安全往往被视为开发和运维之外的额外环节,导致安全漏洞在产品交付后才被发现,增加了修复成本和风险。为了解决这一…...

【JAVA-数据结构】Map和Set

上一篇我们聊到了排序相关内容,这一篇我们对Map和Set进行一系列说明,大家自取。 1.搜索树 1.1 概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节…...

从 0 到 1,用 Python 构建超实用 Web 实时聊天应用

从 0 到 1,用 Python 构建超实用 Web 实时聊天应用 本文深入剖析如何运用 Python 的 Flask 框架与 SocketIO 扩展,搭建一个功能完备的 Web 实时聊天应用。从环境搭建、前后端代码实现,到最终运行展示,逐步拆解关键步骤&#xff0…...

轻松搭建:使用Anaconda创建虚拟环境并在PyCharm中配置

一、使用Anaconda创建虚拟环境 1. 安装Anaconda 2..conda常用的命令 3. 创建虚拟环境-以搭建MachineVision为例 4. 激活虚拟环境 5. 安装依赖包 二、PyCharm配置环境 在进行Python项目开发时,合理的环境管理是必不可少的,特别是当你在多个项目中…...

【新人系列】Python 入门专栏合集

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…...

linux ununtu安装mysql 怎么在my.cnf文件里临时配置 无密码登录

在 Ubuntu 中,若需通过修改 my.cnf 临时禁用 MySQL 的密码验证(例如忘记 root 密码需要重置),可以通过添加 skip-grant-tables 选项实现。以下是具体步骤: 步骤 1:编辑 MySQL 配置文件 1. 打开 MySQL 配置…...

git,bash - 从一个远端git库只下载一个文件的方法

文章目录 git,bash - 从一个远端git库只下载一个文件的方法概述笔记写一个bash脚本来自动下载get_github_raw_file_from_url.shreanme_file.shfind_key_value.sh执行命令 END git,bash - 从一个远端git库只下载一个文件的方法 概述 github上有很多大佬上传了电子书库&#xf…...

python生成的exe文件防止反编译(pyinstaller加密)

python生成的exe文件可以轻松的被破解,为了防止反编译,知乎友友们给出了很多不同的见解,其中主流的回答是pyinstaller加密和niutka打包python,本篇介绍的方法是第一种,pyinstaller打包的时候进行加密,防破解…...

Android移动应用开发实践-1-下载安装和简单使用Android Studio 3.5.2版本(频频出错)

一、下载安装 1.Android Studio3.5.2下载地址:Android Studio3.5.2下载地址 其他版本下载地址:其他版本下载地址 2.安装教程(可以多找几个看看) 安装 | 手把手教你Android studio 3.5.2安装(安装教程)_a…...

Android Audio实战——音频相关基础概念(附)

Android Audio 开发其实就是媒体源数字化的过程,通过将声波波形信号通过 ADC 转换成计算机支持的二进制的过程叫做音频采样 (Audio Sampling)。采样 (Sampling) 的核心是把连续的模拟信号转换成离散的数字信号。 一、声音的属性 1、响度 (Loudness) 响度是指人类可以感知到的…...

5分钟使用Docker部署Paint Board快速打造专属在线画板应用

文章目录 前言1.关于Paint Board2.本地部署paint-board3.使用Paint Board4.cpolar内网穿透工具安装5.创建远程连接公网地址6.固定Paint Board公网地址 💡 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住…...

vue实现根据点击或滑动展示对应高亮

页面需求&#xff1a; 点击左侧版本号&#xff0c;右侧展示对应版本内容并置于顶部右侧某一内容滚动到顶部时&#xff0c;左侧需要展示高亮 实现效果&#xff1a; 实现代码&#xff1a; <template><div><div class"historyBox pd-20 bg-white">…...

java练习(41)

ps&#xff1a;题目来自力扣 最接近的三数之和 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 import java.util.Arrays;class Solut…...

【二分查找 图论】P8794 [蓝桥杯 2022 国 A] 环境治理|普及

本文涉及的基础知识点 本博文代码打包下载 C二分查找 C图论 [蓝桥杯 2022 国 A] 环境治理 题目描述 LQ 国拥有 n n n 个城市&#xff0c;从 0 0 0 到 n − 1 n - 1 n−1 编号&#xff0c;这 n n n 个城市两两之间都有且仅有一条双向道路连接&#xff0c;这意味着任意两…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error

在前端开发中&#xff0c;JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作&#xff08;如 Promise、async/await 等&#xff09;&#xff0c;开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝&#xff08;r…...

LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用

中达瑞和自2005年成立以来&#xff0c;一直在光谱成像领域深度钻研和发展&#xff0c;始终致力于研发高性能、高可靠性的光谱成像相机&#xff0c;为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器

一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下&#xff0c;音视频内容犹如璀璨繁星&#xff0c;点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频&#xff0c;到在线课堂中知识渊博的专家授课&#xff0c;再到影视平台上扣人心弦的高清大片&#xff0c;音…...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...

2.2.2 ASPICE的需求分析

ASPICE的需求分析是汽车软件开发过程中至关重要的一环&#xff0c;它涉及到对需求进行详细分析、验证和确认&#xff0c;以确保软件产品能够满足客户和用户的需求。在ASPICE中&#xff0c;需求分析的关键步骤包括&#xff1a; 需求细化&#xff1a;将从需求收集阶段获得的高层需…...

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档&#xff1f;从规划到实践的完整指南 &#x1f31f; 嗨&#xff0c;我是IRpickstars&#xff01; &#x1f30c; 总有一行代码&#xff0c;能点亮万千星辰。 &#x1f50d; 在技术的宇宙中&#xff0c;我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...

Spring事务传播机制有哪些?

导语&#xff1a; Spring事务传播机制是后端面试中的必考知识点&#xff0c;特别容易出现在“项目细节挖掘”阶段。面试官通过它来判断你是否真正理解事务控制的本质与异常传播机制。本文将从实战与源码角度出发&#xff0c;全面剖析Spring事务传播机制&#xff0c;帮助你答得有…...