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

news2024/11/28 3:34:27

文章目录

  • 前言
  • 一、参数详解
    • 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 注解的类源码图片,方便大家学习的时候做属性对照:
在这里插入图片描述

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

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

相关文章

PHPMySQL基础(四):模拟登录Login功能案例

PHP&MySQL基础(一):创建数据库并通过PHP进行连接_长风沛雨的博客-CSDN博客 PHP&MySQL基础(二):通过PHP对MySQL进行增、删、改、查_长风沛雨的博客-CSDN博客 PHP&MySQL基础(三):处理查询SQL返…

敏捷指标: 评估计划的进展

作者 | Will Hayes, Patrick Place, and Keith Korzec ——卡耐基梅隆大学 度量标准有助于实现一个运作良好的系统,评判现有流程的绩效。在项目交付契约功能时能够对其性能进行监督。本文探讨了在一个复杂的信息物理系统的迭代、增量交付过程中,政府项目…

Django从Models 10分钟建立一套RestfulApi

简介 Django是一套完善而强大的web开发框架, 结合Django Restframework我们可以非常快的搭建一套后台的api, 该api主要特点: 标准的Restful接口, 支持增删改查 每个模型分列表和详情两种接口, 列表GET获取列表/POST新建,详情接口GET获取详情/PUT修改/DELETE删除所有接口自带权…

DJ4-5 基本分段存储管理方式

目录 4.5.1 分段式存储管理方式的引入 4.5.2 分段式存储管理的基本原理 一、分段 二、段表 三、地址变换机构 4.5.3 段的共享和保护 一、分页共享 二、分段共享 4.5.4 段页式存储管理 一、段页式存储管理的引入 二、段页式存储管理 三、地址变换机构 四、评价…

小明找前缀100000(假)

题目背景 小明最近上课天天睡觉,于是啥都不会。 一天,老师终于点兵点将点到他回答问题,你能帮他渡过难关吗? 现在老师给了小明 n 个由 0、1 构成的字符串,然后有 m 次询问, 每次询问给出一个由 0、1 构…

【医学图像】图像分割系列.3 (uncertainty)

介绍几篇使用不确定性引导的医学图像分割论文:UA-MT(MICCAI2019),SSL4MIS(MICCAI2021),UG-MCL(AIIM2022). Uncertainty-aware Self-ensembling Model for Semi-supervise…

3-网络初识-协议

1.概念 协议,网络协议的简称,网络协议是网络通信(即网络数据传输)经过的所有网络设备都必须共同遵从的一组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定,计算机之间才能相互通信交流。通常由三…

Android系统中的Binder通信机制分析(6)- Binder通信机制详解

声明 其实对于Android系统Binder通信的机制早就有分析的想法,记得2019年6、7月份Mr.Deng离职期间约定一起对其进行研究的,但因为我个人问题没能实施这个计划,留下些许遗憾…文中参考了很多书籍及博客内容,可能涉及的比较多先不具…

SER5 5500U 黑苹果系统安装教程

注意事项: 安装黑苹果系统需要一定的技术和操作经验,而且存在一定的风险,安装前请注意备硬盘内的数据,以免数据丢失,不推荐普通用户进行尝试,本系统及引导由黑果小兵独家制作,更多黑苹果教程百度…

安装CHATGPT保姆级教程(windows版)

ai包链接: 链接:https://pan.baidu.com/s/1tKuG4OfkewlDRU292vx8mw?pwdtw8t 提取码:tw8t 一、安装篇 安装python,使用软件包中的python安装程序安装后检查是否安装成功,cmd窗口运行命令: python –vers…

【九章斩题录】C/C++:替换空格(JZ5)

精品题解 🔥 《九章斩题录》 👈 猛戳订阅 📜 目录: JZ5 - 替换空格 「 法一 」暴力美学 「 法二 」另开数组 「 法三 」反向替换(利用 rfind replace) 「 整活 」不用C,Python 一行代码搞…

C#基本语法

关键字 标识符命名规则 标识符中只能出现英文字母、数字、下划线,以及这几种字符,不能出现诸如"空格,!"等这些字符;标识符名称只能以下划线,字母以及打头,不可以用数字作为标识符名…

企业如何运用CRM实现企业数字化战略布局

随着数字化时代的到来,越来越多的企业开始意识到数字化转型的重要性,而CRM(客户关系管理)系统则是企业数字化战略布局中的重要一环,也逐渐受到越来越多企业的关注。 那么,企业如何运用CRM实现数字化战略布局…

自动化测试实战(一)12306火车票网站自动登录工具

还记得2011年春运,12306火车票预订网站经常崩溃无法登录吗。 今天我们就开发一个12306网站自动登录软件。 帮助您轻松订票 Web的原理就是,浏览器发送一个Request给Web服务器,Web服务器处理完这个请求之后发送一个HTTP Response给浏览器。 如…

Mybatis源码细节探究:MappedStatement和Cache对象对照关系研究

给自己的每日一句 不从恶人的计谋,不站罪人的道路,不坐亵慢人的座位,惟喜爱耶和华的律法,昼夜思想,这人便为有福!他要像一棵树栽在溪水旁,按时候结果子,叶子也不枯干。凡他所做的尽…

《面试1v1》类加载过程

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。 面试官: 你了解Java的类加载过程吗?跟我聊聊classes是如何加载到JVM中的。 候选人: Java的类加载过程由加载、验证、准备、解析和初始化5个…

5月底了,现在不想着跳槽可就晚了

前两天跟朋友感慨,今年的铜三铁四、裁员、疫情导致好多人都没拿到offer!现在已经5月底了,具体金九银十只剩下三个月。 对于想跳槽的职场人来说,绝对要从现在开始做准备了。这时候,很多高薪技术岗、管理岗的缺口和市场需求也出来了…

五、常用提升物体的方式

机器人在运动中伸展和提升功能,历来是比赛中机器人的一个重要的性能指标,因为按 比赛要求,机器人在上场前必须经过体积大小的检测,而在场地中如果能够有更好的伸展性 能将对比赛成绩十分有利,因此机器人提升自身高度以…

SAP-MM发票校验容差详解

MIRO发票校验容差详解 MIRO发票校验容差是指收货业务与发票校验业务之间的差异,这种差异可 能是物料价格差异、收货数量差异、收货金额差异等等,总之,发票校验的容差 内容最为丰富,容差类型有很多种,如下表所示&…

【ChatGPT插件第一期】28个ChatGPT插件,让你的学习、工作、生活效率翻倍!

文章目录 人工智能福利文章什么是ChatGPT插件如何使用ChatGPT插件28个插件全解读写在最后 人工智能福利文章 【分享几个国内免费可用的ChatGPT镜像】【10几个类ChatGPT国内AI大模型】【用《文心一言》1分钟写一篇博客简直yyds】【用讯飞星火大模型1分钟写一个精美的PPT】 Cha…