Spring Boot 中的声明式事务是什么,如何使用

news2024/11/18 13:39:17

Spring Boot 中的声明式事务是什么,如何使用

简介

在数据库操作中,事务是一组操作的集合,这些操作在一个逻辑单元内执行,如果其中任何一个操作失败,则整个事务都会被回滚,使得数据库回到事务执行之前的状态。Spring Boot 提供了声明式事务管理,可以使得开发者更加方便地管理事务,同时也提高了应用程序的可维护性。

在这里插入图片描述

声明式事务的优势

使用声明式事务管理,有以下几个优势:

  • 简化代码:开发者可以将事务管理逻辑与业务逻辑分离,使得代码更加简洁明了。

  • 降低耦合性:开发者可以将事务管理逻辑从业务逻辑中剥离出来,降低了不同模块之间的耦合性,使得应用程序更加易于维护。

  • 提高可维护性:开发者可以更加方便地对事务管理逻辑进行调整和优化,提高了应用程序的可维护性。

如何使用声明式事务

在 Spring Boot 中使用声明式事务,需要进行以下几个步骤:

1. 添加依赖

pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

2. 配置数据源

application.properties 文件中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

3. 配置事务管理器

Application 类中添加 @EnableTransactionManagement 注解,启用声明式事务管理:

@SpringBootApplication
@EnableTransactionManagement
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

并在 application.properties 文件中配置事务管理器:

spring.datasource.type=com.zaxxer.hikari.HikariDataSource

# Hibernate
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

# Transaction
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.maximumPoolSize=5
spring.datasource.hikari.minimumIdle=1
spring.datasource.hikari.idleTimeout=60000
spring.datasource.hikari.maxLifetime=1800000
spring.datasource.hikari.poolName=SpringBootHikariCP

# Transaction
spring.transaction.default-timeout=30
spring.transaction.rollback-on-commit-failure=true

4. 配置事务注解

在需要进行事务管理的方法上添加 @Transactional 注解,使得该方法成为一个事务。

@Service
public class UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Transactional
    public void createUser(String name, Integer age) {
        jdbcTemplate.update("insert into user(name, age) values(?, ?)", name, age);
    }

    @Transactional(readOnly = true)
    public List<User> getUsers() {
        return jdbcTemplate.query("select * from user", new BeanPropertyRowMapper<>(User.class));
    }
}

5. 控制器

创建一个控制器类,用于处理 HTTP 请求。例如,我们创建一个 UserController 类:

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @PostMapping
    public void createUser(@RequestParam String name, @RequestParam Integer age) {
        userService.createUser(name, age);
    }

    @GetMapping
    public List<User> getUsers() {
        return userService.getUsers();
    }
}

声明式事务注解

在 Spring Boot 中,使用 @Transactional 注解来进行事务管理,该注解有以下几个属性:

  • value:指定事务管理器的名称或者ID,如果未指定则使用默认的事务管理器。

  • readOnly:指定事务是否为只读模式,默认为 false,表示事务可读可写。如果设置为 true,则表示事务为只读模式,不允许进行数据修改操作。

  • timeout:指定事务超时时间,单位为秒,默认为 -1,表示没有超时限制。

  • rollbackFor:指定哪些异常需要回滚事务,默认情况下,Spring 只会回滚 RuntimeException 及其子类异常,如果想要回滚其他异常,需要在该属性中指定。

  • noRollbackFor:指定哪些异常不需要回滚事务,与 rollbackFor 属性相反。

总结

本文介绍了 Spring Boot 中的声明式事务管理,以及如何使用它来管理事务。使用声明式事务管理,可以使得开发者更加方便地管理事务,同时也提高了应用程序的可维护性。在 Spring Boot 中,使用声明式事务管理,需要进行以下几个步骤:添加依赖、配置数据源、配置事务管理器、配置事务注解、创建控制器类。@Transactional 注解是进行事务管理的核心,开发者可以通过其属性来对事务进行定制化配置。

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

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

相关文章

不看产品、不重销售,聊聊Forrester推荐的CLG战略

近日&#xff0c;Forrester的分析师们发现&#xff0c;企业&#xff08;尤其是B2B企业&#xff09;对于CLG战略的关注空前增加。而且&#xff0c;越来越多SaaS企业选择CLG战略来取代以前的PLG&#xff08;产品导向型增长&#xff09;或SLG&#xff08;销售导向型增长&#xff0…

SpringSecurity之基本原理

目录 核心过滤器 FilterSecurityInterceptor ExceptionTranslationFilter UsernamePasswordAuthenticationFilter BasicAuthenticationFilter 过滤器加载过程 重要接口 UserDetailsService接口 PasswordEncoder接口 springSecurity本质上就是一个过滤器链&#xff0c;…

RabbitMQ系列(16)--用SpringBoot整合RabbitMQ

1、新建项目 2、新建Spring项目 3、选择合适的SpringBoot版本&#xff0c;依赖在这里可以先不选&#xff0c;可以在项目生成后在pom.xml文件里批量的导入依赖 4、设置项目的Maven (1)打开设置 (2)在搜索框里输入Maven搜索Maven设置&#xff0c;然后根据自己的实际情况设置Mave…

优化篇--Vue模版语法做动态渲染

Vue模版语法做动态渲染&#xff0c;随便记录一下 <a-row v-for"(row, rowIndex) in footerConfig" :key"rowIndex"><a-col span"4" v-for"(col, colIndex) in row" :key"colIndex"><span class"total-l…

新来的资深java不会lambda表达式,中级开发都笑拉了--lambda流这么难吗,教你怎么玩早学早吃香

因为一个人就全体 虽然没提名字但是说的意思和报身份证没区别, 我自己看着都尴尬… 标题就是事情的经过,和同事的聊天记录在最下面 前言 Lambda表达式是优化代码的工具&#xff0c;使得代码更简洁、易读&#xff0c;符合现代开发的趋势,以及推动函数式编程在Java开发中的流行…

web3创业有哪些机会?(一)

目录 1. 去中心化金融&#xff08;DeFi&#xff09;&#xff1a;2. 去中心化身份验证和数字身份&#xff1a;3. 去中心化市场和电子商务&#xff1a;4. 区块链游戏和虚拟资产&#xff1a;5. 数据隐私和安全&#xff1a;6. 去中心化社交媒体&#xff1a;7. 去中心化能源交易&…

Webpack原理与实战 --- 背景介绍

模块化的演进过程 Stage 1 - 文件划分方式 缺点&#xff1a; 模块直接在全局工作&#xff0c;大量模块成员污染全局作用域&#xff1b;没有私有空间&#xff0c;所有模块内的成员都可以在模块外部被访问或者修改&#xff1b;一旦模块增多&#xff0c;容易产生命名冲突&#…

自动化测试及典型开源的自动化测试工具

目录 前言&#xff1a; 自动化测试 自动化测试的意义 手工测试的局限性 自动化测试带来的好处 自动化测试的前提条件 自动化测试的方法 自动化测试的不足 自动化测试的应用方向 典型开源的自动化测试工具 前言&#xff1a; 自动化测试是一种使用软件工具和脚本来执行…

第二章——开始学习C++

进入C 首先介绍一个显示消息的简单C程序&#xff08;不同于以往的“Hello&#xff0c;world"&#xff09; #include<iostream> int main() {using namespace std;cout << "Come up and C me some time.";cout << endl;cout << "…

手机上无处不在的AI,原来还藏有这么多秘密

目录 一、AI在拍照中的应用 二、AI在日常生活中的应用 三、手机上AI的来自哪&#xff1f; 尽管2023年才过完了一半&#xff0c;但来自AI领域的科技震撼却没有要结束的意思。回顾过往&#xff0c;AI从没像今天这般那样受人瞩目&#xff0c;似乎一夜之间&#xff0c;它就成了新…

速览6月更新|EasyV产研团队带来产品功能优化

EasyV产研团队在6月份为您带来了一系列令人期待的产品功能优化&#xff0c;让数字化管理更加轻松高效&#xff01;话不多说&#xff0c;快来看看都有哪些新变化吧&#xff5e; 速览6月更新内容&#xff1a; 01 平台升级&#xff5c;工作台功能优化 02 模板上新&#xff5c;能…

LeetCode打卡 day58--单调栈

一个人的朝圣 — LeetCode打卡第58天 知识总结 Leetcode 739. 每日温度题目说明代码说明 Leetcode 496. 下一个更大元素 I题目说明代码说明 知识总结 单调栈的应用, 就是需要构建一个单调递增或者单调递减的栈, 去解决下一个大(小)的元素的问题 Leetcode 739. 每日温度 题目链…

网络安全面试题(含答案)

防范常见的 Web 攻击 什么是SQL注入攻击 攻击者在HTTP请求中注入恶意的SQL代码&#xff0c;服务器使用参数构建数据库SQL命令时&#xff0c;恶意SQL被一起构造&#xff0c;并在数据库中执行。 用户登录&#xff0c;输入用户名 lianggzone&#xff0c;密码 ‘ or ‘1’’1 &a…

JavaScript 之【事件循环】机制的深入浅出解读

前言&#xff1a; JavaScript 作为一种单线程的开发语言&#xff0c;在执行的时候会有特定的风格&#xff0c;本章节以 JS 单线程的特点为引入&#xff0c;详细分析讲解了 JS 的事件循环机制 目录 什么是【进程】什么是【线程】浏览器拥有哪些进程和线程【渲染主线程】的工作模…

冒泡排序(思路+代码)

冒泡排序&#xff1a; 变量&#xff1a; flag 如果没有交换过就终止循环就是flase&#xff0c;终止外层循环 第二层循环&#xff1a;n个数比较n-1次 第一层循环&#xff1a; 第一趟&#xff0c;比较n-1次 第二趟&#xff0c;比较n-2次 ... ... 代码&#xff1a; import…

展望“智”造未来|深眸科技以AI+机器视觉,夯基产业新发展格局

近日&#xff0c;2023昆山元宇宙国际装备展在昆山国际会展中心落下帷幕。展会期间&#xff0c;各大展商携新技术、新产品、新概念纷纷亮相&#xff0c;为现场参展观众和嘉宾呈现如梦似幻的元宇宙盛会。 此次展会&#xff0c;深眸科技认识了诸多工业元宇宙领域的优质产品及企业…

Spring Boot3入门快速体验-Developing Your First Spring Boot Application

一、进入Getting Started https://spring.io/ 点击Spring Boot点击LEARN,再点击Reference Doc.&#xff1a; 再点击Getting Started Introducing Spring Boot, System Requirements, Servlet Containers, Installing Spring Boot, and Developing Your First Spring Boot App…

前端Vue组件之仿京东拼多多领取优惠券弹出框popup 可用于电商商品详情领券场景使用

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。通过组件化开发&#xff0c;可以有效实现单…

痞子衡嵌入式:从功耗测试角度了解i.MXRTxxx系列片内SRAM分区电源控制

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家介绍的是从功耗测试角度了解i.MXRTxxx系列片内SRAM分区电源控制。 我们知道配合 MCU 一起工作的存储器包含 ROM(Flash) 和 RAM 两类&#xff0c;前者主要放 RO 代码和数据&#xff0c;后者放 RW …

文件系统考古4:如何支持多个文件系统

Steve Kleiman 在 1986 年撰写了《Vnodes: An Architecture for Multiple File System Types in Sun UNIX》一文。这篇论文幅较短&#xff0c;大部分内容是数据结构的列举&#xff0c;以及 C 语言结构之间相互指向的图表。 Steve Kleiman是分布式文件系统领域的专家&#xff0c…