【事务】@Transactional 注解参数详解

文章目录

  • 前言
  • 一、参数详解
    • 1.1、isolation(事务隔离级别)
    • 1.2、propagation(事务传播机制)
    • 1.3、readOnly(事务读写性)
    • 1.4、noRollbackFor 和 noRollbackForClassName(遇到时不回滚)
    • 1.5、rollbackFor 和 rollbackForClassName(遇到时回滚)
    • 1.6、timeout(超时时间)
    • 1.7、value(指定使用的事务管理器)
  • 二、@Transactional 注解的失效场景
  • 三、@Transactional 注解源码

前言

通过本篇学习,你将加深对 @Transactional 注解以及所有的属性的理解,还可以学习到 @Transactional 注解常见的失效场景。

@Transactional 注解特性如下:

  • @Target({ElementType.TYPE, ElementType.METHOD}):设定注解使用范围是类和方法上;
  • @Retention(RetentionPolicy.RUNTIME):设定生命周期为全周期,支持使用反射机制的代码读取和使用;
  • @Inherited:指明如果该注解修饰的父类被子类继承,那么子类也具备事务特性;
  • @Documented:表明这个注解应该被 javadoc工具记录。

一、参数详解

@Transactional 注解的关键属性大致有九个(如图):

参数意义
isolation事务隔离级别,默认为DEFAULT
propagation事务传播机制,默认为REQUIRED
readOnly事务读写性,默认为false
noRollbackFor一组异常类,遇到时不回滚,默认为{}
noRollbackForClassName一组异常类名,遇到时不回滚,默认为{}
rollbackFor一组异常类,遇到时回滚,默认为{}
rollbackForClassName一组异常类名,遇到时回滚,默认为{}
timeout超时时间,以秒为单位
value可选的限定描述符,指定使用的事务管理器,默认为“”

1.1、isolation(事务隔离级别)

隔离级别是指若干个并发的事务之间的隔离程度,与我们开发时候主要相关的场景包括:脏读取、重复读、幻读。

  • Isolation 的 Eum 类中定义了“五个”表示隔离级别的值,如下:

    • Isolation.DEFAULT:使用各个数据库默认的隔离级别【默认】
    • Isolation.READ_UNCOMMITTED:读取未提交数据(会出现脏读, 不可重复读)(基本不使用)
    • Isolation.READ_COMMITTED:读取已提交数据(会出现不可重复读和幻读)
    • Isolation.REPEATABLE_READ:可重复读(会出现幻读)
    • Isolation.SERIALIZABLE:串行化
  • 在这里,简单解释下什么是“脏读”,“不可重复读”,“幻读”:

    • 脏读:一个事务读取到另一事务未提交的更新数据;
    • 不可重复读: 在同一事务中,多次读取同一数据返回的结果有所不同。换句话说:后续读取可以读到另一事务已提交的更新数据。相反,"可重复读"在同一事务中多次读取数据时,能够保证所读数据一样,也就是后续读取不能读到另一事务已提交的更新数据;
    • 幻读: 一个事务读到另一个事务已提交的 insert 数据;
  • 最后,有必要补充一下常用数据库的默认隔离级别:

    • MYSQL:默认为REPEATABLE_READ
    • SQLSERVER:默认为READ_COMMITTED
    • Oracle:默认隔离级别 READ_COMMITTED

注意:mysql数据库,当且仅当引擎是InnoDB,才支持事务(MyIsam引擎不支持事务)。

1.2、propagation(事务传播机制)

所谓事务的传播机制是指,如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。

Propagation 的 Eum 类中定义了“七个”表示隔离级别的值,如下:

  • Propagation.REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是 最常见的选择,也是Spring【默认】的传播机制
  • Propagation.SUPPORTS:持当前事务,如果当前有事务,就以事务方式执行;如果当前没有事务,就以非事务方式执行
  • Propagation.MANDATORY:使用当前的事务,且必须在一个已有的事务中执行,如果当前不存在事务,否则抛出异常
  • Propagation.REQUIRES_NEW:不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
  • Propagation.NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,就把当前事务挂起
  • Propagation.NEVER:以非事务方式执行,且必须在一个没有的事务中执行,如果当前存在事务,则抛出异常【与Propagation.MANDATORY相反】
  • Propagation.NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则执行与【Propagation.REQUIRED 】类似的操作

1.3、readOnly(事务读写性)

默认情况下是 false(即:不指定只读性),设置为 true 的含义是: 告诉程序该方法下使用的是只读操作,如果进行其他非读操作,则会跑出异常。

  • 事务的只读性,概念:

从这一点设置的时间点开始(时间点a),到这个事务结束的过程中,其他事务所提交的数据,该事务将看不见!!即:查询中不会出现别人在时间点a之后提交的数据。

  • 应用场景:

    • 如果你一次执行单条查询语句,则没有必要启用事务的只读性支持,数据库默认支持SQL执行期间的读一致性;

    • 如果你一次执行多条查询语句,例如统计查询,报表查询。在这种场景下,多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态。此时,就有必要启用事务的只读性支持。

【注意】:是一次执行多次查询来统计某些信息,这时为了保证数据整体的一致性,要用只读事务。

1.4、noRollbackFor 和 noRollbackForClassName(遇到时不回滚)

用来指明不回滚的条件是哪些异常类或者异常类名。

1.5、rollbackFor 和 rollbackForClassName(遇到时回滚)

用来指明回滚的条件是哪些异常类或者异常类名。

Spring默认情况下会对运行期异常(RunTimeException)进行事务回滚,如果遇到checked异常就不回滚。

1.6、timeout(超时时间)

用于设置事务处理的时间长度,阻止可能出现的长时间的阻塞系统或者占用系统资源,单位为秒。

如果超时设置事务回滚,并抛出TransactionTimedOutException异常。

1.7、value(指定使用的事务管理器)

value 主要用来指定不同的事务管理器,主要用来满足在同一个系统中,存在不同的事务管理器的场景需要。

比如,在Spring中声明了两种事务管理器txManager1,txManager2。然后,用户可以根据需要,修改这个参数来指定特定的txManager。

存在多个事务管理器的情况:在一个系统中,需要访问多个数据源,则必然会配置多个事务管理器。

二、@Transactional 注解的失效场景

@Transactional 注解的看似简单易用,但如果对它的用法一知半解,还是会踩到很多坑的。

我总结了六种常见的失效场景,概要如下,具体分析,请请看我另一篇博文:@Transactional 注解的失效场景,这个问题见过太多的人栽跟头,一篇刨根问底,让面试官都闭嘴

  • @Transactional 应用在非 public 修饰的方法上,不支持回滚;
  • @Transactional 注解属性 propagation 设置错误;
  • @Transactional 注解属性 rollbackFor 设置错误;
  • 在同一个类中方法调用,导致 @Transactional 失效;
  • 异常被你的 catch 处理了,导致 @Transactional 没办法回滚而失效;
  • 数据库配置了不支持事务的引擎,或者数据库本身就不支持事务。

三、@Transactional 注解源码

最后,附一张 @Transactional 注解的类源码图片,方便大家学习的时候做属性对照:
在这里插入图片描述

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

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

相关文章

智能出行 驱动未来|2023 开放原子全球开源峰会 CARSMOS 开源智能出行生态年会即将启幕

由开放原子开源基金会主办,元遨 / CARSMOS 开源智能出行项目组协办,深信科创、Futurewei Technologies、Open Motors、北极雄芯等单位共同承办的 2023 开放原子全球开源峰会 “CARSMOS 开源智能出行生态年会” 将于 6 月 12 日在北京经开区北人亦创国际会…

华为OD机试真题 Java 实现【分糖果】【2022Q2 200分】,附详细解题思路

一、题目描述 小明从糖果盒中随意抓一把糖果,每次小明会取出一半的糖果分给同学们。 当糖果不能平均分配时,小明可以选择从糖果盒中(假设盒中糖果足够)取出一个糖果或放回一个糖果。 小明最少需要多少次(取出、放回…

基于深度学习的高精度家禽猪检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度家禽猪检测识别系统可用于日常生活中或野外来检测与定位家禽猪目标,利用深度学习算法可实现图片、视频、摄像头等方式的家禽猪目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

维护嵌入式 Linux 内核——So Easy

导读Pengutronix 内核黑客 Jan Lbbe 总结了嵌入式 Linux 中正在不断增长的安全威胁,并在这次欧洲嵌入式 Linux 会议上概述了一个计划,以保持长期设备的安全和功能完整。 安全漏洞只发生在 Windows 上的好日子正在快速过去。恶意软件黑客和拒绝服务老手们…

【JavaSE】Java基础语法(三十八):并发工具类

文章目录 1. Hashtable2. ConcurrentHashMap基本使用3. ConcurrentHashMap1.7原理4. ConcurrentHashMap1.8原理5. CountDownLatch6. Semaphore 1. Hashtable Hashtable出现的原因 : 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下…

CentOS7使用Docker快速安装Davinci

环境信息 操作系统:CentOS7Docker : 23.0.6 (已配置阿里云镜像加速) 安装步骤 安装docker-compose-plugin 官方的例子使用的是docker-compose,但是由于yum能够安装的最新斑斑是1.x,而且官方的docker-compose要求最低版本为2.2以…

如何在电脑上图片裁剪?裁剪图片大小的方法介绍

图片裁剪大小的优点 在数字化时代,图片已成为人们日常生活中使用最频繁的媒介之一。然而,由于不同尺寸和比例的图片在不同的平台上展示效果有所不同,因此需要对其进行裁剪。 图片裁剪大小的主要优点包括: 1. 优化页面显示&…

地震勘探基础(十)之地震速度关系

地震速度 地震勘探中引入了多种速度的概念,如下图所示。 层速度、平均速度和均方根速度之间的关系 层速度指的是某一套地层垂向上,由于地质条件相对稳定,地层顶底厚度比上地震波的传播时间为层速度,用 v n v_n vn​ 表示。 如下…

Eclipse教程 Ⅸ

今天继续来学习Eclipse 快速修复、Eclipse 浏览菜单、Eclipse 查找以及Eclipse 悬浮提示的内容!老规矩,废话不多说,开始吧。 Eclipse 快速修复 使用快速修复 在 Eclipse 编辑器中当你输入字母时,编辑器会对你输入的内容进行错误…

Fiddler抓包工具配置+Jmeter基本使用

一、Fiddler抓包工具的配置和使用 在编写网关自动化脚本之前,得先学会如何抓包,这里以Fiddler为例。会抓包的同学可以跳过这一步,当然看看也是没坏处的…… 局域网络配置 将要进行抓包的手机与电脑连入同一局域网,电脑才能够…

CPU、内存、缓存的关系

术语解释 (1)CPU(Central Processing Unit) 中央处理器 (2)内存 内存用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁,内存的运行决定…

生成式模型的质量评估标准

Sample Quality Matrix 如何评价生成式模型的效果?ISFIDsFIDPrecision & RecallPrecisonRecall计算precision和recall 如何评价生成式模型的效果? Quality: 真实性(逼真,狗咬有四条腿) Diversity: 多样性&#x…

Hive

Hive 概览 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。 本质是将SQL转换为MapReduce程序。 主要用途:用来做离线数据分析,比直接用MapReduce开发效率更高。 架构 数…

机器视觉怎么对陶瓷板外观尺寸进行自动检测?

随着陶瓷行业的发展,陶瓷板的生产和质量控制面临越来越高的要求。而机器视觉技术作为一种高精度、高效率、无损、可靠性高的自动化检测手段,已经成为陶瓷板外观尺寸自动化检测的首选方案。本文就如何利用机器视觉对陶瓷板外观尺寸进行自动检测进行分析和…

常用模拟低通滤波器的设计——巴特沃斯滤波器

常用模拟低通滤波器的设计——巴特沃斯(Butterworth)滤波器 滤波器是一种具有频率选择作用的电路或运算处理系统,它具有区分区分输入信号的各种不同频率成分的功能,具有滤除噪声和分离各种不同信号的功能。综合一个滤波器的基本步骤分为逼近和实现。逼近…

设计模式之~享元模式

定义: 享元模式英文称为“Flyweight Pattern”,又译为羽量级模式或者蝇量级模式。 享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式&#xff0c…

【每日挠头算法题(1)】——旋转字符串|亲密字符串

文章目录 一、旋转字符串思路1思路2 二、亲密字符串思路 总结 一、旋转字符串 点我直达终点~ 思路1 前提:如果s串和goal串长度不等,则goal串不可能是s串旋转得来,直接返回false; 通过观察,可以发现每旋转一次&#…

多线程屏障CyclicBarrier

文章目录 前言一、CyclicBarrier可以做什么?二、使用步骤1 单参数CyclicBarrier2 多参数 CyclicBarrier3 与CyclicBarrier类似的Exchanger 总结 前言 多线程中的CyclicBarrier,同样也是juc包下的一个工具类; 一、CyclicBarrier可以做什么? CyclicBarri…

一款开源的无线CMSIS DAP ARM芯片下载调试器详细说明

文章目录 概要1. 一般概念1.1 CMSIS—DAP的一般概念1.2 支持的芯片1.3 典型应用场景 2. 原理图与尺寸图2.1 Host端(发送端)原理图2.2 Target(目标)端原理图2.3 Host尺寸图2.4 Target尺寸图2.5 实物图 3. 使用方法3.1 连接方法3.1.…

4-5.配置信息和路由信息

一、配置信息 app.run()的参数 参数1:host,如果我们不指定,默认值是127.0.0.1。参数2:port,如果我们不指定,默认值是5000。参数3:debug,调试模式,如果不指定&#xff0…