Spring 事务@Transactional

Spring 事务@Transactional

事务 @Transactional 可设置多个属性来控制事务的行为:

  • propagation:事务传播行为

  • isolation:隔离级别

  • timeout:超时设置(单位:秒)

  • readOnly:事务是否只读。如果设置为 true,Spring 会优化事务的执行,比如不会进行脏读。

  • rollbackFor:哪些异常会导致事务回滚。默认情况下,运行时异常会导致事务回滚,而检查型异常不会。

  • noRollbackFor:哪些异常不会导致事务回滚。

propagation 事务传播行为

事务传播行为 Propagation 定义了当一个事务方法被另一个事务方法调用时,事务应该如何传播。以下是 propagation 枚举的详细说明:

传播行为常量描述
当前存在事务,加入该事务REQUIRED如果当前存在事务,则加入该事务。如果当前没有事务,则创建一个新的事务(默认项)
当前存在事务,以非事务方式运行SUPPORTS如果当前存在事务,则加入该事务。如果当前没有事务,则以非事务的方式继续运行。
当前存在事务,必须在该事务中运行MANDATORY如果当前存在事务,则加入该事务。如果当前没有事务,则抛出异常。
创建一个新事务,挂起当前事务REQUIRES_NEW总是创建一个新的事务。如果当前存在事务,则将当前事务挂起。当自己执行完成后(提交或回滚),再接着执行被挂起的事务
以非事务方式运行,如果当前存在事务,则挂起NOT_SUPPORTED以非事务方式运行。如果当前存在事务,则挂起当前事务。
以非事务方式运行,如果当前存在事务,则抛出异常NEVER以非事务方式运行。如果当前存在事务,则抛出异常。
在嵌套事务中运行,如果当前没有事务,则创建NESTED如果当前存在事务,则在嵌套事务中运行。如果当前没有事务,则创建一个新的事务。

正确理解和使用事务传播行为对于确保事务的一致性和正确性至关重要。

isolation 隔离级别

隔离级别是事务管理的一个关键属性,它定义了一个事务在并发环境下如何与其他事务隔离。隔离级别决定了当前事务在并发环境下如何看到其他并发事务所做的修改。隔离级别越高,数据一致性越好,但并发性能可能会降低。反之,隔离级别越低,并发性能越好,但数据一致性风险增加;以下是 isolation 枚举的详细说明:

隔离级别常量描述
默认项DEFAULT默认,事务将使用底层数据库的默认隔离级别
读未提交READ_UNCOMMITTED最低级别的隔离,允许一个事务读取到其他事务尚未提交的数据,存在脏读(Dirty Read)问题,即读取到其他事务未提交的数据
读已提交READ_COMMITTED当前事务只能读取到其他事务已经提交的数据,解决了脏读问题,但仍然存在不可重复读(Non-Repeatable Read)问题,即在同一事务中多次读取同一数据集的结果可能不同
可重复读REPEATABLE_READ保证在同一个事务中多次读取同一数据集的结果是一致的,解决了不可重复读问题,但可能存在幻读(Phantom Read)问题,即一个事务在读取某个范围内的记录时,另一个事务插入或删除记录,导致第一个事务再次读取时返回不同的记录数
串行化SERIALIZABLE最高级别的隔离,通过锁定涉及的所有数据来确保事务序列化执行,从而避免了脏读、不可重复读和幻读,解决了所有并发问题,但性能成本最高,因为会显著降低并发性能

timeout 事务超时

限定事务在指定时间内完成。超时事务回滚。时间单位s。默认值-1,即事务将可以无限期地运行直到完成。

readOnly 事务是否只读

bool类型,默认 false,声明事务是否为只读事务,设置为 true 时,该事务只涉及读操作,不会进行修改数据库操作。对于只读事务,Spring 会进行一些优化,因为它知道该事务不更改数据,因此减少锁的持有时间,提高并发性能

只读事务常用于以下情况:

  • 查询操作:比如统计、数据导出等只涉及到查询数据库的操作。
  • 某些特定的更新操作:如果更新操作只涉及到更新一些不需要事务支持的字段(如:更新一些不需要保证原子性的字段),也可设置为只读。

当 readOnly 属性设置为 false(默认值)时,表示该事务可能会进行读和写操作。在这种情况下,Spring 不会应用只读事务的优化

rollbackFor 异常回滚

Exception 数组,默认{ RuntimeException.class };指定哪些异常类型会触发事务回滚。通过设置 rollbackFor 属性,可以扩展触发回滚的异常类型,包括已检查异常或其他异常类型

noRollbackFor 异常不回滚,继续执行

Exception 数组,无默认值,用于指定哪些异常类型不会触发事务回滚。通过设置 noRollbackFor 属性,可以排除某些异常类型,使得即使这些方法抛出这些异常,事务也不会回滚

在 Spring 中,默认情况下:

  • 当遇到 运行时异常(RuntimeException)或其子类时,Spring 事务管理器会触发事务回滚。
  • 当遇到 已检查异常(即非运行时异常,继承自 Exception 但不继承自 RuntimeException)时,Spring 事务管理器默认不会触发事务回滚

@Transactional 使用

  • 一个方法在类中调用另一个方法,并且被调用的方法没有自己的事务注解(如下所示),那么默认情况下,被调用方法中的数据库操作不会加入调用者方法的事务中,被调用方法中的数据库操作将在它们自己的独立事务中执行,调用者的事务不会自动传播到被调用者
      @Servicepublic class SaveService {@Transactionalpublic void funA() {this.funB();// 数据库操作this.funC();}public void funB() {// 数据库操作}public void funC() {// 数据库操作}}
    
  • 为了保持数据的一致性,建议被调用方法加上 @Transactional
  • 事务传播行为只适用于被 @Transactional 注解的方法
  • @Transactional 属性设置仅对当前所注解的方法起效,并不对方法内部调用的其他方法起效
    public class MyService {@Transactionalpublic void funA() {// 数据库操作(仅对这里的数据操作起效,并不对funB()起效)this.funB();}public void funB() {// 数据库操作}
    }
    
  • 对事务属性的设置也会影响事务的执行。
      // funA 方法被调用,它会在自己的事务中执行,且 funB 和 funC 方法会加入这个事务。// funC 或 funB 被单独调用,不会创建新事务,而是会在没有事务的上下文中执行@Servicepublic class MyService {@Transactionalpublic void funA() {this.funB();this.funC();}@Transactional(propagation = Propagation.SUPPORTS)public void funB() {// 数据库操作}@Transactional(propagation = Propagation.SUPPORTS)public void funC() {// 数据库操作}}
    
  • 事务传播行为由被调用方的方法决定,而不是调用方的方法
  • 嵌套事务(NESTED)需要数据库支持嵌套事务

    虽然 MySQL 不支持真正意义上的 嵌套事务,但使用Propagation.REQUIRES_NEW仍然是可行的,因为它会启动一个新的事务,并且这个新事务与外部事务是隔离的。如果新事务成功,它会被提交,即使外部事务最终失败也是如此。如果新事务失败,它会被回滚,并且不影响外部事务

  • 使用 REQUIRES_NEW 时,确保理解它会导致当前事务被挂起,并且新事务的异常不会导致当前事务回滚

拓展

@Transactional 仅能适用于单机数据库保持数据一致性,面对多节点多应用的分布式场景下,可使用Alibaba SETA框架实现分布式事务

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业IT架构转型之道:阿里巴巴中台战略思想与架构实战感想

文章目录 第一章:数据库水平扩展第二章:中台战略第三章:阿里分布式服务架构HSF(high speed Framework)、早期Dubbo第四章:共享服务中心建设原则第五章:数据拆分实现数据库能力线性扩展第六章&am…

鸿蒙的进击之路

1. 题记: 为什么要写鸿蒙,因为她是华为的,为什么是华为就要写,因为华为背负了国人太多太多的包袱,或点赞或抨击。 我是强烈支持华为的,但我会客观公正地去评价华为的产品,就比如这篇博文&#…

【CTFN】基于耦合翻译融合网络的多模态情感分析的层次学习

同样用了翻译模块的论文->MTMSA 代码地址->github地址 abstract 多模态情感分析是一个具有挑战性的研究领域,涉及多个异构模态的融合。主要的挑战是在多模式融合过程中出现一些缺失的模式。然而,现有的技术需要所有的模态作为输入,因…

Go的环境搭建以及GoLand安装教程

目录 一、开发环境Golang安装 二、配置环境变量 三、GoLand安装 四、Go 语言的 Hello World 一、开发环境Golang安装 官方网址: The Go Programming Language 1. 首先进入官网,点击Download,选择版本并进行下载: ​ ​ 2. …

Spring IoC DI

1. IoC 1.1 容器 容器是用来容纳某种物品的(基本)装置。——来自:百度百科 生活中的水杯,垃圾桶,冰箱等等,都是容器 代码中的容器,如:List/Map -> 数据存储容器;T…

Python异常检测 - LSTM(长短期记忆网络)

系列文章目录 Python异常检测- Isolation Forest(孤立森林) python异常检测 - 随机离群选择Stochastic Outlier Selection (SOS) python异常检测-局部异常因子(LOF)算法 Python异常检测- DBSCAN Python异常检测- 单类支持向量机(…

DolphinDB 与南方科技大学联合授课啦!

11月1日,南方科技大学商学院和 DolphinDB 联合举办了高校课程讲座。讲座由南方科技大学商学院高级研究学者冯鹏举主持,DolphinDB 创始人兼 CEO 周小华博士、某百亿私募数据平台架构师潜蛟老师进行精彩演讲。 Part 1 : 大数据时代下数据库架构革新与生态…

3.PyCharm工具

第三方IDE,集成开发工具,官网下载。 社区版本,免费使用。 创建项目

微信小程序——用户隐私保护指引填写(详细版)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【在Linux世界中追寻伟大的One Piece】poll代码改写

目录 1 -> poll代码改写 1 -> poll代码改写 结合select代码&#xff0c;将select server更改成为pollserver&#xff0c;不是一件困难的事情。 #pragma once#include <iostream> #include <string> #include <poll.h> #include <memory> #inc…

安利一款开源企业级的报表系统SpringReport

SpringReport是一款企业级的报表系统&#xff0c;支持在线设计报表&#xff0c;并绑定动态数据源&#xff0c;无需写代码即可快速生成想要的报表&#xff0c;可以支持excel报表和word报表两种格式&#xff0c;同时还可以支持excel多人协同编辑&#xff0c;后续考虑实现大屏设计…

【11月10日最新】V2.6.1版本植物大战僵尸杂交版分享与下载

&#x1f447;下载链接&#xff1a; 点击下载 更新内容 植物大战僵尸杂交版2.6.1版本的更新内容主要包括以下几个方面&#xff1a; 梦幻联动&#xff1a; 与UP主轻柔北风合作&#xff0c;推出了“植物大战僵尸贴吧版”。联动植物包括石果子与雷蘑菇杂交的雷果子&#xff0c;…

Jenkins找不到maven构建项目

有的可能没有出现maven这个选项 解决办法&#xff1a;需要安装Maven项目插件 输入​Maven Integration plugin​

路过宝安乌石岩庙记

​每周带娃从上屋地铁去罗租大道的七彩城堡儿童乐园玩&#xff0c;路上都会经过乌石岩庙附近。听说香火很繁盛&#xff0c;娃说也想去看看&#xff0c;于是来到了乌石岩庙。 石岩乌石岩庙 广东省深圳市宝安区老街一区94号 ​从百度知悉&#xff1a;乌石岩庙&#xff0c;又称“…

练习LabVIEW第四十四题

学习目标&#xff1a; 计算学生三门课(语文&#xff0c;数学&#xff0c;英语)的平均分&#xff0c;并根据平均分划分成绩等级。要求输出等级A,B,C,D,E。90分以上为A&#xff0c;80&#xff5e;89为B&#xff0c;70&#xff5e;79为C&#xff0c;60&#xff5e;69为D&#xff…

软考高级架构 - 8.1 - 系统质量属性与架构评估 - 超详细讲解+精简总结

第8章 系统质量属性与架构评估 软件系统属性包括功能属性和质量属性&#xff0c;而软件架构重点关注质量属性。 8.1 软件系统质量属性 8.1.1 概述 软件系统的质量反映了其与需求的一致性&#xff0c;即&#xff1a;软件系统的质量高低取决于它是否能满足用户提出的需求&#…

最详细【Elasticsearch】Elasticsearch Java API + Spring Boot集成 实战入门(基础篇)

Elasticsearch Java API Spring Boot集成 实战入门&#xff08;基础篇&#xff09; 一、初始Elasticseach1、什么是Elasticseach2、Elasticsearch生态2、Elasticsearch结构3、Elasticsearch核心概念4、Elasticsearch 实现全文检索的原理 二、Elasticsearch入门1、入门-环境安装…

类文件结构详解

回顾一下字节码 在 Java 中&#xff0c;JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class 的文件&#xff09;&#xff0c;它不面向任何特定的处理器&#xff0c;只面向虚拟机。Java 语言通过字节码的方式&#xff0c;在一定程度上解决了传统解释型语言执行效率低…

RabbitMQ的应用

七种工作模式介绍 1.Simple(简单模式) P&#xff1a;生产者&#xff0c;也就是要发送信息的程序 C&#xff1a;消费者&#xff0c;消息的接收者 Queue&#xff1a;消息队列。图中黄色背景部分&#xff0c;类似一个邮箱&#xff0c;可以缓存发送信息&#xff1b;生产者向其中…

科研绘图系列:R语言组合堆积图(stacked plot)

文章目录 介绍加载R包数据数据预处理画图1画图2组合图形系统信息介绍 堆积图(Stacked Chart),也称为堆叠图,是一种常用的数据可视化图表,主要用于展示不同类别的数据量在总体中的分布情况。堆积图可以是柱状图、条形图或面积图的形式,其中各个类别的数据量被叠加在一起,…