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

[笔记]事务简介-springboot

在Spring Boot中,事务的管理通常通过注解来实现,使得配置变得简单而直观。这种方式与Spring Boot的设计理念一致,即减少显式配置,增加自动配置。以下是如何在Spring Boot项目中应用和管理事务的详细说明:


Spring Boot中的事务管理

  1. Spring Boot事务基础

Spring Boot沿用了Spring的事务管理概念,但在配置和使用上更为简化,主要依赖于注解来管理事务。

1.1. Spring Boot事务特性

与传统的Spring事务管理相同,Spring Boot事务也遵循ACID原则:

  1. 原子性(Atomicity)

  2. 一致性(Consistency

  3. 隔离性(Isolation)

  4. 持久性(Durability)

1.2. 事务的隔离级别和传播行为

Spring Boot支持相同的事务隔离级别和传播行为,如:

  • 隔离级别:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。

  • 传播行为:REQUIRED、REQUIRES_NEW、SUPPORTS等。

  1. Spring Boot中的声明式事务

2.1. 开启事务支持

在Spring Boot中,通常通过添加@EnableTransactionManagement注解在配置类上启用事务管理,但在Spring Boot中这通常是不必要的,因为Spring Boot的自动配置已经包含了事务管理的支持。

2.2. 使用@Transactional注解
  • @Transactional:这是控制事务的主要注解。它可以应用于类或方法上。当应用于类上时,该类的所有公共方法将成为事务方法。

  • 属性配置:可以配置如下属性:

    • propagation:定义事务的传播行为。

    • isolation:定义事务的隔离级别。

    • timeout:定义事务的超时时间。

    • readOnly:标记事务是否为只读。

    • rollbackFor:定义哪些异常类型会触发事务回滚。

    • noRollbackFor:定义哪些异常类型不会触发事务回滚。

  1. 示例代码

3.1. Service层事务应用
@Service
public class UserServiceImpl implements UserService {@Transactional(rollbackFor = Exception.class)public void createUser(User user) {// 方法实现}@Transactional(readOnly = true)public User getUserById(Long id) {// 方法实现}
}

在这个例子中,createUser方法上的@Transactional注解指定了在发生任何Exception时回滚事务。而getUserById方法则是一个只读事务,这对于提高查询操作的效率是有帮助的。

3.2. 自定义事务管理器

如果您需要自定义事务管理器,可以在配置类中定义:

@Configuration
public class TransactionConfig {@Beanpublic PlatformTransactionManager transactionManager(DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}

在大多数情况下,您不需要这样做,因为Spring Boot会为您自动配置事务管理器。

  1. 事务不生效的情况

同样地,在Spring Boot中,如果在同一个类中,一个没有使用事务的方法调用了一个使用了事务的方法,事务是不会生效的。这是因为事务的应用需要通过代理来实现,而直接的方法调用不会经过代理。

此外,对于声明式事务,Spring默认只对运行时异常进行回滚。如果需要对检查型异常进行回滚,可以通过@Transactional注解的rollbackFor属性来指定。


以上就是在Spring Boot项目中关于事务管理的主要内容。Spring Boot使得事务管理变得更加

简单,减少了大量的配置工作,同时保留了Spring事务管理的灵活性和强大功能。

传播行为

传播行为是指在事务环境中,方法之间相互调用时事务如何传播。例如,当一个事务方法被另一个事务方法调用时,是否要加入已存在的事务,或者创建一个新的事务等。

在Spring和Spring Boot中,有几种不同的传播行为,例如REQUIRED(如果当前存在事务,就加入该事务;如果没有,则创建一个新的事务)和REQUIRES_NEW(总是创建一个新的事务)等。了解和合理使用这些传播行为对于设计正确的事务策略是非常重要的。

this. 调用和事务失效问题

在Spring和Spring Boot中,事务是通过AOP代理实现的。当在同一个类中,一个非事务方法内部调用了一个事务方法时,这种this.的调用方式将直接调用方法,而不会通过代理,导致事务处理失效。

解决这个问题的一种方法是使用Spring的自我注入。即在类内部使用@Autowired@Resource将自己注入进来,然后通过这个注入的实例调用事务方法,以确保通过代理:

@Service
public class MyService {@Autowiredprivate MyService myService; // 自我注入public void nonTransactionalMethod() {myService.transactionalMethod(); // 通过代理调用}@Transactionalpublic void transactionalMethod() {// 事务处理}
}

抛出非运行时异常导致的事务不回滚

在Spring的声明式事务管理中,默认情况下,只有在抛出运行时异常(继承自RuntimeException)和错误(Error)时,事务才会回滚。如果需要让检查型异常(即非运行时异常,如SQLException)也触发事务回滚,可以通过@Transactional注解的rollbackFor属性来实现:

@Transactional(rollbackFor = Exception.class)
public void someTransactionalMethod() {// 业务逻辑
}

在这里,将rollbackFor属性设置为Exception.class意味着所有类型的异常,包括非运行时异常,都会触发事务回滚。

相关文章:

[笔记]事务简介-springboot

在Spring Boot中,事务的管理通常通过注解来实现,使得配置变得简单而直观。这种方式与Spring Boot的设计理念一致,即减少显式配置,增加自动配置。以下是如何在Spring Boot项目中应用和管理事务的详细说明: Spring Boot中…...

初识计算机网络 | 计算机网络的发展 | 协议初识

1.计算机网络的发展 “矛盾是普遍存在的,矛盾是事物联系的实质内容和事物发展的根本动力!” 计算机在诞生之初,在军事上用来计算导弹的弹道轨迹!在发展的过程中(商业的推动,国家政策推动)&…...

【sgTree】自定义组件:加载el-tree树节点整棵树数据,实现增删改操作。

特性 可以自定义主键、配置选项支持预定义节点图标:folder文件夹|normal普通样式多个提示文本可以自定义支持动态接口增删改节点可以自定义根节点id可以设置最多允许添加的层级深度支持拖拽排序,排序过程还可以针对拖拽的节点深度进行自定义限制支持隐藏…...

vue2面试题:vue组件之间的通信方式有哪些?

vue2面试题:vue组件之间的通信方式有哪些? 回答思路:1.组件通信的目的-->2.组件通信的分类-->3.组件通信的方案1.组件通信的目的2.组件通信的分类3.组件通信的方案(1)通过props传递数据(2&#xff09…...

Pytorch神经网络模型nn.Sequential与nn.Linear

1、定义模型 对于标准深度学习模型,我们可以使用框架的预定义好的层。这使我们只需关注使用哪些层来构造模型,而不必关注层的实现细节。 我们首先定义一个模型变量net,它是一个Sequential类的实例。 Sequential类将多个层串联在一起。 当给…...

C++-gdb调试常用功能

文章目录 启动gdb运行程序设置断点运行控制查看源码查看信息查看变量线程相关 gdb调试常用功能如下,其中bin为要调试的程序,arg为参数 启动gdb 启动调试 gdb bin带参数启动 gdb --args bin arg1 arg2so预加载LD_PRELOAD/path/to/lib.so && gdb …...

快速上手的AI工具-文心一言辅助学习

前言 大家好晚上好,现在AI技术的发展,它已经渗透到我们生活的各个层面。对于普通人来说,理解并有效利用AI技术不仅能增强个人竞争力,还能在日常生活中带来便利。无论是提高工作效率,还是优化日常任务,AI工…...

Boost 适用 filesystem 库,statx 函数无法找到引用问题的解决方案。

1、boost 高版本使用了 statx 函数,这个函数是在 Linux 内核版本 4.11 之后引入的。 所以:可以升级 Linux 内核版本到4.11之后即可。 2、降低 boost 库版本到 1.70 以下 3、正确的路,改 boost 的编译代码 先看这个: Filesyste…...

MyBatis中一级缓存是什么?SqlSession一级缓存失效的原因?如何理解一级缓存?

一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就 会从缓存中直接获取,不会从数据库重新访问 使一级缓存失效的四种情况: 1) 不同的SqlSession对应不同的一级缓存 2) 同一…...

项目解决方案:多地医馆的高清视频监控接入汇聚联网

目 录 一、背景 二、建设目标及需求 1.建设目标 2.现状分析 3.需求分析 三、方案设计 1.设计依据 2.设计原则 3.方案设计 3.1 方案描述 3.2 组网说明 四、产品介绍 1.视频监控综合资源管理平台介绍 2.视频录像服务器和存储 2.1概述 2.2存储设计 …...

【前端基础--2】

选择器优先级 style标签中&#xff1a; .text{color: pink;}div{color: red;}#box{color: skyblue;} body标签中&#xff1a; <div class"text" id"box">猜猜我是什么颜色的</div> 运行结果&#xff1a; 选择器优先级权重&#xff1a; id选…...

【GitHub项目推荐--提取文字】【转载】

提取视频中的字幕 这个开源项目是提取视频中字幕的开源项目&#xff0c;提取视频中的关键帧&#xff0c;检测视频帧中文本的所在位置&#xff0c;识别视频帧中文本的内容。 不知道大家有没有做笔记的习惯&#xff0c;这个开源项目就很方便的把你一个视频中的字幕提取出来&…...

WebSocket与Shiro认证信息传递的实现与安全性探讨

在现代Web应用程序中&#xff0c;WebSocket已经成为实时双向通信的重要组件。而Shiro作为一个强大的Java安全框架&#xff0c;用于处理身份验证、授权和会话管理。本文将探讨如何通过WebSocket与Shiro集成&#xff0c;实现认证信息的传递&#xff0c;并关注在这一过程中确保安全…...

QT 实现自动生成小学两位数加减法算式

小学生加减法训练 QT实现–自动生成两位数加减法算式&#xff0c;并输出txt文件 可以copy到word文件&#xff0c;设置适当字体大小和行间距&#xff0c;带回家给娃做做题 void MainWindow::test(int answerMax, int count) {// 创建一个随机数生成器QRandomGenerator *gener…...

小程序学习-20

建议每次构建npm之前都先删除miniprogram_npm...

面试题-【消息队列】

消息队列 问题1 如何进行消息队列的技术选型优点解耦 &#xff08;pub/sub模型&#xff09;异步&#xff08;异步接口性能优化&#xff09;削峰 使用消息队列的缺点几种消息队列的特性 问题2 引入消息队列之后该如何保证其高可用性RabbitMQ的高可用kafka高可用 问题3 在消息队列…...

【江科大】STM32:I2C通信外设(硬件)

在将2C通信外设之前&#xff0c;我们先捋一捋&#xff0c;串口的相关特点来和I2C进行一个对北比。 首先&#xff1a; 1,大部分单片机&#xff0c;设计的PCB板均带有串口通信的引脚&#xff08;也就是通信基本都借助硬件收发器来实现&#xff09; 2.对于串口的异步时序&#xff…...

【机器学习300问】15、什么是逻辑回归模型?

一、逻辑回归模型是为了解决什么问题&#xff1f; 逻辑回归&#xff08;Logistic Regression&#xff09;是一种广义线性回归分析模型&#xff0c;尤其适用于解决二分类问题&#xff08;输出为两个类别&#xff09;。 &#xff08;1&#xff09;二分类举例 邮件过滤&#xff…...

C#调用C动态链接库

前言 已经没写过博客好久了&#xff0c;上一篇还是1年半前写的LTE Gold序列学习笔记&#xff0c;因为工作是做通信协议的&#xff0c;然后因为大学时没好好学习专业课&#xff0c;现在理论还不扎实&#xff0c;不敢瞎写&#xff1b; 因为工作原因&#xff0c;经常需要分析一些字…...

前端实现转盘抽奖 - 使用 lucky-canvas 插件

目录 需求背景需求实现实现过程图片示意实现代码 页面效果lucky-canvas 插件官方文档 需求背景 要求实现转盘转动抽奖的功能&#xff1a; 只有正确率大于等于 80% 才可以进行抽奖&#xff1b;“谢谢参与”概率为 90%&#xff0c;“恭喜中奖”概率为 10%&#xff1b; 需求实现 实…...

C++ Template 特化机制详解

C模板特化机制是泛型编程中的核心特性之一&#xff0c;它允许开发者针对特定类型或条件提供定制化的实现&#xff0c;从而在保持代码通用性的同时优化性能或处理特殊场景。本文将深入解析模板特化的核心机制&#xff0c;帮助读者掌握这一高阶技巧&#xff0c;并理解其在实际项目…...

从HBuilder到npm:UniApp项目迁移与打包实战指南

1. 为什么需要从HBuilder迁移到npm&#xff1f; 很多UniApp开发者最初都是通过HBuilder这个集成开发环境入门&#xff0c;毕竟它提供了开箱即用的UniApp开发体验。但随着项目规模扩大&#xff0c;团队协作需求增加&#xff0c;或者需要更灵活的构建配置时&#xff0c;基于npm的…...

3个核心革新让英雄联盟玩家彻底告别繁琐游戏操作

3个核心革新让英雄联盟玩家彻底告别繁琐游戏操作 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在快节奏的英雄联盟对局中&#…...

电工必看:正弦交流电路中的相量法实战技巧(附计算示例)

电工必看&#xff1a;正弦交流电路中的相量法实战技巧&#xff08;附计算示例&#xff09; 在电气工程领域&#xff0c;正弦交流电路的分析是每位电工和电气工程师必须掌握的核心技能。面对复杂的电路计算&#xff0c;传统的三角函数解析法往往让从业者陷入繁琐的运算泥潭。相量…...

百度网盘提取码智能获取工具:让资源下载效率提升100倍的秘密武器

百度网盘提取码智能获取工具&#xff1a;让资源下载效率提升100倍的秘密武器 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 还在为获取百度网盘分享链接的提取码而浪费宝贵时间吗&#xff1f;面对"请输入提取码"的…...

哔哩下载姬DownKyi:新手快速上手指南与实战技巧

哔哩下载姬DownKyi&#xff1a;新手快速上手指南与实战技巧 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;…...

体验开发新范式:如何用快马平台的AI大模型将想法直接变成代码

最近尝试用AI辅助开发工具来快速实现一个任务管理应用&#xff0c;整个过程让我对现代开发方式有了全新认识。和大家分享一下这个有趣的实践经历&#xff1a; 需求分析阶段 传统开发需要先梳理功能清单&#xff0c;但这次我直接把自然语言描述输入到InsCode(快马)平台的AI对话框…...

HunyuanVideo-Foley实战案例:为AI生成视频自动匹配Foley音效工作流

HunyuanVideo-Foley实战案例&#xff1a;为AI生成视频自动匹配Foley音效工作流 1. 项目背景与价值 在视频制作领域&#xff0c;Foley音效&#xff08;环境音、动作音效等&#xff09;的创作往往需要专业录音设备和大量人工处理。HunyuanVideo-Foley创新性地将视频生成与音效生…...

Comsol多重法诺共振拟合:探索与实践

comsol多重法诺共振拟合。 在光学与光子学领域&#xff0c;多重法诺共振现象一直是研究的热点。而Comsol作为一款强大的多物理场仿真软件&#xff0c;为我们研究多重法诺共振提供了有力的工具&#xff0c;尤其是其中的拟合功能&#xff0c;能够帮助我们更精准地理解和分析这一…...

神经高利贷:预支未来技能导致认知崩溃

在软件测试领域&#xff0c;从业者常面临一个隐形威胁&#xff1a;过度追求新技能而忽视认知极限&#xff0c;最终引发崩溃。这种现象被称为“神经高利贷”&#xff0c;即通过预支未来学习能力来应对当前挑战&#xff0c;结果导致认知资源枯竭、错误率飙升&#xff0c;甚至职业…...