Spring Boot 中的 @Transactional 注解是什么,原理,如何使用

news2024/11/17 16:43:29

Spring Boot 中的 @Transactional 注解是什么,原理,如何使用

简介

在 Spring Boot 中,@Transactional 注解是非常重要的一个注解,用于实现数据库事务的管理。通过使用 @Transactional 注解,我们可以很方便地对事务进行控制,从而保证数据的一致性和完整性。在本文中,我们将介绍 @Transactional 注解的作用、原理以及如何使用。

在这里插入图片描述

@Transactional 注解的作用

@Transaction 注解是 Spring Boot 中用于声明事务的注解之一。在使用 @Transactional 注解时,需要将该注解放在需要进行事务管理的方法或类上,该注解将会告诉 Spring Boot 这些方法或类需要进行事务管理。在使用 @Transactional 注解时,还可以指定一些属性,例如事务的隔离级别、事务的传播行为等。

在 Spring Boot 中,@Transactional 注解的作用是将被注解的方法或类纳入 Spring Boot 的事务管理范围内,从而实现事务的管理。当方法或类被调用时,Spring Boot 将会自动开启一个事务,并在方法或类执行完成后,根据执行结果决定事务是否需要提交或回滚。

@Transactional 注解的原理

在 Spring Boot 中,@Transactional 注解是通过 AOP(面向切面编程)机制实现的。具体来说,@Transactional 注解是通过 Spring Boot 的事务拦截器来实现的。当被注解的方法或类被调用时,Spring Boot 的事务拦截器将会拦截该方法或类,并根据注解中指定的属性来开启一个事务。

在开启事务时,Spring Boot 首先会检查当前线程上是否已经存在一个事务。如果已经存在一个事务,则会根据注解中指定的传播行为来决定是否需要创建一个新的事务。如果不存在一个事务,则会创建一个新的事务。

在事务执行过程中,如果出现了异常,则 Spring Boot 会根据事务的设置来决定是否回滚事务。如果事务执行成功,则 Spring Boot 会根据事务的设置来决定是否提交事务。

如何使用 @Transactional 注解

在 Spring Boot 中,使用 @Transactional 注解非常简单。只需要在需要进行事务管理的方法或类上加上 @Transactional 注解,即可将该方法或类纳入事务管理范围内。下面是一个使用 @Transactional 注解的例子:

@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    @Transactional
    public void saveUser(User user) {
        userRepository.save(user);
    }
    
}

在上面的例子中,saveUser() 方法被标记为 @Transactional 注解,因此该方法将被纳入事务管理范围内。

需要注意的是,@Transactional 注解默认的传播行为是 REQUIRED,即如果当前线程上已经存在一个事务,则将该方法加入到当前事务中执行,否则将创建一个新的事务。如果需要修改传播行为,则可以使用 propagation 属性来指定。

除了传播行为之外,@Transactional 注解还支持其他属性,例如隔离级别、只读事务等。下面是一个带有属性的 @Transactional 注解的例子:

@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, readOnly = true)
    public User getUserById(Long userId) {
        return userRepository.findById(userId).orElse(null);
    }
    
}

在上面的例子中,getUserById() 方法被标记为 @Transactional 注解,并指定了传播行为、隔离级别和只读事务属性。

除了在方法上使用 @Transactional 注解之外,还可以在类上使用 @Transactional 注解,将该类中所有的方法都纳入事务管理范围内。下面是一个例子:

@Service
@Transactional
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    public void saveUser(User user) {
        userRepository.save(user);
    }
    
    public User getUserById(Long userId) {
        return userRepository.findById(userId).orElse(null);
    }
    
}

在上面的例子中,UserService 类被标记为 @Transactional 注解,因此该类中的所有方法都将被纳入事务管理范围内。

总结

@Transaction 注解是 Spring Boot 中非常重要的一个注解,用于实现数据库事务的管理。通过使用 @Transactional 注解,我们可以很方便地对事务进行控制,从而保证数据的一致性和完整性。在本文中,我们介绍了 @Transactional 注解的作用、原理以及如何使用。在实际开发中,合理使用 @Transactional 注解可以提高代码的可维护性和可读性,同时也能提高系统的性能和稳定性。

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

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

相关文章

用Docker部署Nginx

部署步骤: 1.拉取镜像 docker pull nginx 2.创建并进入容器 docker run -d --name nginx01 -p 3344:80 nginx #注意nginx01是起的名字,3344是公网访问的端口,80是Nginx的默认端口 3.启动Nginx curl localhost:3344 4.在我的windows系统访…

OAuth2:使用Gitee第三方授权

gitee OAuth2文档 1. 配置授权页url 传入client_id(创建应用获得)、redirect_uri(需要通过第三方授权跳转的url) https://gitee.com/oauth/authorize?client_id{client_id}&redirect_uri{redirect_uri}&response_type…

ACSNet分割模型搭建

原论文:Adaptive Context Selection for Polyp Segmentation源码:https://github.com/ReaFly/ACSNet. 直接步入正题~~~ 一、基础模块 class ConvBlock(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride, padding):supe…

linux下卸载vmware

linux下卸载vmware 一、卸载二、vmware安装及使用 &emps;如果linux下安装了vmware系列产品,需要卸载或重装的,本文介绍了详细的卸载方法: 一、卸载 一般的发行版都不会带有vmware,所以通常是下载安装包来安装。这里主要说的就…

谷歌chrome浏览器所有历史版本下载及selenium自动化控制插件资源分享

使用python selenium做网页自动化开发的小伙伴经常需要用到google chrome浏览器以及chromedriver插件。 谷歌浏览器所有历史版本下载链接: chrome历史版本,点击下载 chromedriver插件下载地址:下载链接1:点击下载下载链接2…

一文了解python中pip的使用

目录 🍒pip的作用 🍒pip的使用 🍒运行python 🍓1.终端运行 🍓2.运行python文件 🍓3.pycharm 🍒IDE的概念 🦐博客主页:大虾好吃吗的博客 🦐专栏地址&#xff1…

scGen perturbation response prediction

如何利用scGen进行扰动响应预测 scGen是什么 scGen is a generative model to predict single-cell perturbation response across cell types, studies and species (Nature Methods, 2019). scGen is implemented using the scvi-tools framework. 文章传送门 Original tut…

Axure教程——100内的随机加减

本文介绍用Axure制作随机加减数效果 效果 预览地址https://ik31ey.axshare.com 制作 一、需要的元件: 2个动态面板,2个文本框,4个矩形,1个图片 二、制作过程 1、随机加 拖入一个矩形元件,命名为“被加数”&#xff…

MQ选手终极对决:比较几个主流MQ实现分布式事务的方案

1、MQ实现分布式事务 在分布式事务的实现中,ACK消息和半消息是两种实现分布式事务的两种不同机制,它们的共同点是都使用了两阶段提交的机制,但是它们的实现细节和适用场景有所不同。具有一些区别和特点。下面是ACK消息和半消息在实现分布式事…

暑期旅游市场火热,旅游行业如何做好邮件营销

随着2023年全国高考结束,以及各大高校毕业生也将陆续告别校园,许多学生都会用一场具有庆贺、欢聚意义的毕业旅游来为自己的高中生涯或大学生涯画上完美句号。携程数据显示,6月9日至8月底,高中和大学毕业生的旅游订单逐渐增多&…

QT 5.9.9 配置使用 MYSQL5.7 数据库

目录 Mysql下载安装 QT 下载安装 编译MYSQL mingw构建方式 msvc构建方式 QT中MYSQL测试使用 因为版权问题,Qt本身不自带Mysql数据库的驱动,因此如果想要借用Qt操作Mysql数据库,需要手动进行编译。 Mysql下载安装 【Qt】 Mysql服务端安装…

抖音seo账号矩阵系统源码搭建服务器内耗量?

一、短视频账号矩阵系统视频库存量技术云端如何处理? 1.抖音SEO账号矩阵系统源码搭建服务器内耗量怎么后端处理 非常低,可以轻松应对大量用户使用。通过服务器的高效运行,系统可以提供稳定的服务,并且快速响应用户的操作。源码搭…

2023年软件测试这个行业怎么样?

今天我要从一个新的角度来论述软件测试行业怎么样。 最近热搜新闻是张雪峰最近抨击的“新闻专业不要报,建议把孩子打晕后,随便选个专业都比新闻好”,重庆大学新闻学教授发文抨击张雪峰偏激言论,眼睛雪亮的人民群众却纷纷站队张雪…

C#复制构造函数学习

通过从另一个对象复制变量或将一个对象的数据复制到另一个对象来创建对象的构造函数称为复制构造函数。 复制构造函数是一个参数化构造函数,包含相同类类型的参数。它的主要用途是将新实例初始化为现有实例的值。 using System;namespace Mytest{class User {publi…

非凸科技金牌赞助“第三届中国Rust开发者大会”

6月17-18日,由Rust中文社区主办的“第三届中国Rust开发者大会”在上海圆满举行。非凸科技作为金牌赞助商,全力协助大会顺利开展,共同为中国 Rustaceans带来一场技术交流盛宴。 本次大会演讲主题内容广泛,涉及编程语言、量化金融、…

springboot mybatis-plus慢sql输出日志,log4jdbc使用

前言 无论使用原生JDBC、mybatis还是hibernate,使用log4j等日志框架可以看到生成的SQL,但是占位符和参数总是分开打印的,不便于分析,显示如下的效果: Log4jdbc 是一个开源 SQL 日志框架,它使用代理模式实现对常用的…

C++之operator重载运算符应用(一百四十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

采集发布到WordPress指定文章作者

采集的数据发布到wordpress系统网站,指定发布文章的作者设置方法教程。 目录 1. 获取用户名 2. 对接采集器指定作者 3. 随机作者 1. 获取用户名 进入Wordpress系统后台,点击控制台左侧菜单的【用户】,再点击展开列表的【所有用户】&…

word2vec self-attention transformer diffusion的技术演变

这一段时间大模型的相关进展如火如荼,吸引了很多人的目光;本文从nlp领域入门的角度来总结相关的技术路线演变路线。 1、introduction 自然语言处理(Natural Language Processing),简称NLP。这个领域是通过统计学、数…

使用homebrew安装RabbitMQ3.12.XX版本无法启动的解决方案

使用brew安装RabbitMQ3.12.XX版本遇到无法启动的天坑 首先来看RabbitMQ 3.12.0的新版说明,这也是我为什么无法启动的原因 所需的功能标志 RabbitMQ 3.12.0 将要求在升级前启用 3.11.x 系列版本的所有功能标志、 类似于 3.11.0 要求在 3.9.0 之前引入的所有功能标…