掌握Spring Boot事务管理,也就一杯咖啡的时间!

前言:

        事务管理是确保数据安全和一致性的关键组成部分,特别是在进行数据库操作时。SpringBoot事务与数据库事务是密切相关的,具体来说,SpringBoot事务是对数据库事务的封装和管理。下面分别数据库事务,springboot事务进行详细阐述。
                

一、数据库事务:

在数据库操作中,事务(Transaction)是一个逻辑单元,由一组操作组成,这些操作要么全部成功,要么全部失败,以保证数据的一致性和完整性。事务具有以下几个关键特性:

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会停留在中间状态。
  • 一致性(Consistency):事务执行前后,数据库的状态必须保持一致。
  • 隔离性(Isolation):并发事务之间互不影响,每个事务都看作数据库的唯一操作。
  • 持久性(Durability):一旦事务提交,其结果是永久性的,即使系统崩溃也不会丢失。

1.事务管理:

        包括事务的开启、执行、提交和回滚等操作。

2.隔离级别:

        事务隔离级别是指多个事务之间的隔离程度。常见的事务隔离级别有:

  • 读未提交(Read Uncommitted):允许读取未提交的数据,可能导致脏读。

简单理解:事务a新增一条数据,没有提交,事务b读取到了这条数据。

  • 读已提交(Read Committed):只读取已提交的数据,防止脏读,但可能出现不可重复读。

简单理解:事务b在读取数据时,事务a修改了这些数据并提交,可能会导致“不可重复读”。即同一事务内多次读取同一数据可能得到不同结果。

  • 可重复读(Repeatable Read):确保在一个事务内多次读取数据时数据一致,防止不可重复读,但可能出现幻读(在某些数据库系统中,如MySQL的InnoDB引擎,通过间隙锁可以避免幻读)。
  • 串行化(Serializable):最高的隔离级别,完全隔离,防止脏读、不可重复读和幻读。但会严重影响并发性能。

3.事务日志:

在数据库事务管理中,日志是维护数据一致性和完整性的重要手段。常见的日志包括:

  • Undo日志(回滚日志:用于撤销未提交的事务对数据库的影响。当事务失败或回滚时,Undo日志会记录需要撤销的操作,以便将数据库恢复到事务开始前的状态。
  • Redo日志(重做日志:用于记录已提交事务的操作。当系统崩溃或发生故障时,Redo日志可以用于恢复已提交的事务,确保数据的持久性。

二:SpringBoot事务

        SpringBoot事务是对数据库事务的封装和管理,SpringBoot事务是Spring框架提供的一种声明式事务管理方式,它允许开发者通过简单的注解或配置来管理事务,而无需在代码中显式地控制事务的开始、提交和回滚。这种方式极大地简化了事务管理的复杂性,提高了开发效率。

  • 封装与管理:SpringBoot事务本质上是对数据库事务的封装和管理。它使用数据库连接,并根据Spring的事务配置来操作这个连接,从而实现对数据库事务的开启、提交和回滚等操作。
  • 事务管理器:SpringBoot通过事务管理器(如DataSourceTransactionManagerJpaTransactionManager等)来管理数据库事务。这些事务管理器是Spring框架提供的,用于处理不同数据源和技术的事务。
  • 声明式事务管理:SpringBoot支持声明式事务管理,通过@Transactional注解来指定事务的传播行为、隔离级别、回滚规则等。这种方式使得事务管理更加简洁和方便,开发者只需关注业务逻辑,而无需关心事务的具体实现。
  • 事务的传播特性与隔离级别:SpringBoot事务继承了数据库事务的传播特性和隔离级别。传播特性定义了多个事务方法相互调用时,一个事务方法应该如何加入或创建事务。隔离级别则定义了多个事务并发执行时的相互影响程度。SpringBoot允许开发者通过配置来指定这些属性,以满足不同的业务需求。

传播行为

        定义了事务的边界和行为。其实就是事务方法或不是事务方法A调用事务方法B进行讨论,用谁的事务....

  • REQUIRED(默认):如果当前存在事务,则加入该事务;如果没有事务,则创建一个新事务。
  • REQUIRES_NEW:总是创建一个新事务,如果当前存在事务,则将当前事务挂起。
  • SUPPORTS:如果当前存在事务,则加入该事务;如果没有事务,则以非事务方式执行。
  • NOT_SUPPORTED:总是以非事务方式执行,如果当前存在事务,则将当前事务挂起。
  • MANDATORY:如果当前存在事务,则加入该事务;如果没有事务,则抛出异常。
  • NEVER:总是以非事务方式执行,如果当前存在事务,则抛出异常。
  • NESTED:如果当前存在事务,则在当前事务中嵌套一个事务(仅支持JDBC事务管理器)。

1. 声明式事务管理

        声明式事务管理是通过注解或XML配置来实现的,这是Spring Boot推荐的事务实现方式。最常用的注解是@Transactional

代码示例

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Transactional
    public void updateUser(User user) {
        try {
            // 更新用户信息
            userMapper.update(user);
            // 其他数据库操作
            // ...
        } catch (Exception e) {
            // 异常处理
            // ...
        }
    }
}

2. 编程式事务管理

编程式事务管理通常使用TransactionTemplatePlatformTransactionManager进行控制。

代码示例



@Service
public class UserService {

    @Autowired
    private TransactionTemplate transactionTemplate;

    @Autowired
    private UserMapper userMapper;

    public void updateUser(User user) {
        transactionTemplate.execute(new TransactionCallbackWithoutResult() {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus status) {
                try {
                    // 更新用户信息
                    userMapper.update(user);
                    // 其他数据库操作
                    // ...
                } catch (Exception e) {
                    status.setRollbackOnly();
                    
                }
            }
        });
    }
}

3. 配置事务管理器

在Spring Boot中,我们需要配置事务管理器来管理事务。最常见的事务管理器是DataSourceTransactionManager(适用于JDBC操作)和JpaTransactionManager(适用于JPA操作)。管理dataSource的事务。

代码示例

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
public class TransactionConfig {

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

4.多数据源示例:

springboot集成mybatis多数据源HikariCP 这篇文章中分个数据源,都需要定义自己的事务管理器。

/**
 * @Description first数据源
 */
@Configuration
@MapperScan(basePackages = "com.das.demo.mapper", sqlSessionFactoryRef = "firstSqlSessionFactory")
public class FirstDataSourceConfiguration {
 

 

    @Primary
    @Bean("firstHikariConfig")
    @ConfigurationProperties(prefix = "spring.datasource.first")
    public HikariConfig firstHikariConfig() {
        return new HikariConfig();
    }
 
    @Primary
    @Bean("firstDataSource")
    public HikariDataSource firstDataSource(@Qualifier("firstHikariConfig") HikariConfig hikariConfig) {
        return new HikariDataSource(hikariConfig);
    }
 
    /**
     * 配置事务管理器
     *
     * @return
     */
    @Bean(name = "firstTransactionManager")
    @Primary
    public PlatformTransactionManager firstTransactionManager(@Qualifier("firstDataSource") HikariDataSource hikariDataSource) {
        return new DataSourceTransactionManager(hikariDataSource);
    }
 
    
}

总结

        事务管理是确保数据安全和一致性的关键组成部分。Spring Boot提供了强大的事务管理功能,支持声明式事务管理和编程式事务管理两种方式。通过合理配置事务的传播行为、隔离级别、超时时间和回滚规则等属性,我们可以确保Spring Boot应用程序中的事务处理既安全又高效。希望本文能够帮助你更好地理解Spring Boot中的事务管理,并通过代码示例掌握其应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS学习日记(jQuery库)

前言 今天先更新jQuery库的介绍,它是一个用来帮助快速开发的工具 介绍 jQuery是一个快速,小型且功能丰富的JavaScript库,jQuery设计宗旨是“write less,do more”,即倡导写更少的代码,做更多的事&#xf…

stm32下的ADC转换(江科协 HAL版)

十二. ADC采样 文章目录 十二. ADC采样12.1 ADC的采样原理12.2 STM32的采样基本过程1.引脚与GPIO端口的对应关系2.ADC规则组的四种转换模式(**)2.2 关于转换模式与配置之间的关系 12.3 ADC的时钟12.4 代码实现(ADC单通道 & ADC多通道)1. 单通道采样2. 多通道采样 19.ADC模数…

124. 二叉树中的最大路径和【 力扣(LeetCode) 】

文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 124. 二叉树中的最大路径和 一、题目描述 二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径…

【安全科普】NUMA防火墙诞生记

一、我为啥姓“NUMA” 随着网络流量和数据包处理需求的指数增长,曾经的我面对“高性能、高吞吐、低延迟”的要求,逐渐变得心有余而力不足。 多CPU技术应运而生,SMP(对称多处理)和NUMA(非一致性内存访问&a…

免费送源码:Java+Springboot+MySQL Springboot多租户博客网站的设计 计算机毕业设计原创定制

Springboot多租户博客网站的设计 摘 要 博客网站是当今网络的热点,博客技术的出现使得每个人可以零成本、零维护地创建自己的网络媒体,Blog站点所形成的网状结构促成了不同于以往社区的Blog文化,Blog技术缔造了“博客”文化。本文课题研究的“…

数字IC后端实现之Innovus specifyCellEdgeSpacing和ICC2 set_placement_spacing_rule的应用

昨天帮助社区IC训练营学员远程协助解决一个Calibre DRC案例。通过这个DRC Violation向大家分享下Innovus和ICC2中如何批量约束cell的spacing rule。 数字IC后端手把手实战教程 | Innovus verify_drc VIA1 DRC Violation解析及脚本自动化修复方案 下图所示为T12nm A55项目的Ca…

IntelliJ+SpringBoot项目实战(七)--在SpringBoot中整合Redis

Redis是项目开发中必不可少的缓存工具。所以在SpringBoot项目中必须整合Redis。下面是Redis整合的步骤: (1)因为目前使用openjweb-sys作为SpringBoot的启动应用,所以在openjweb-sys模块的application-dev.yml中增加配置参数&…

深挖C++赋值

详解赋值 const int a 10; int b a;&a 0x000000b7c6afef34 {56496} &a 0x000000b7c6afef34 {10} 3. &b 0x000000b7c6afef54 {10} 总结: int a 10 是指在内存中(栈)中创建一个int (4 byte)大小的空间…

java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程

文章目录 PC Register堆虚拟机栈方法区(Metaspace元空间双亲委派机制类加载器 类装载的执行过程 PC Register 程序计数器(Program Counter Register)是 Java 虚拟机(JVM)中的一个组件,它在 JVM 的内存模型中扮演着非常…

11.12机器学习_特征工程

四 特征工程 1 特征工程概念 特征工程:就是对特征进行相关的处理 一般使用pandas来进行数据清洗和数据处理、使用sklearn来进行特征工程 特征工程是将任意数据(如文本或图像)转换为可用于机器学习的数字特征,比如:字典特征提取(特征离散化)、文本特征提取、图像特征提取。 …

STL序列式容器之list

相较于vector的连续性空间&#xff0c;list相对比较复杂&#xff1b;list内部使用了双向环形链表的方式对数据进行存储&#xff1b;list在增加元素时&#xff0c;采用了精准的方式分配一片空间对数据及附加指针等信息进行存储&#xff1b; list节点定义如下 template<clas…

算法日记 26-27day 贪心算法

接下来的题目有些地方比较相似。需要注意多个条件。 题目&#xff1a;分发糖果 135. 分发糖果 - 力扣&#xff08;LeetCode&#xff09; n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每…

Linux下编译MFEM

本文记录在Linux下编译MFEM的过程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1Boost1.74.0oneAPI2024.2.1 一、安装依赖 二、编译代码 附录I: CMakeUserPresets.json {"version": 4,"configurePresets": [{&quo…

Pytest-Bdd-Playwright 系列教程(9):使用 数据表(DataTable 参数) 来传递参数

Pytest-Bdd-Playwright 系列教程&#xff08;9&#xff09;&#xff1a;使用 数据表&#xff08;DataTable 参数&#xff09; 来传递参数 前言一、什么是 datatable 参数&#xff1f;Gherkin 表格示例 二、datatable 参数的基本使用三、完整代码和运行效果完整的测试代码 前言 …

C语言项⽬实践-贪吃蛇

目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…

使用 Prompt API 与您的对象聊天

tl;dr&#xff1a;GET、PUT、PROMPT。现在&#xff0c;可以使用新的 PromptObject API 仅使用自然语言对存储在 MinIO 上的对象进行总结、交谈和提问。在本文中&#xff0c;我们将探讨这个新 API 的一些用例以及代码示例。 赋予动机&#xff1a; 对象存储和 S3 API 的无处不在…

Oracle OCP认证考试考点详解082系列19

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 91. 第91题&#xff1a; 题目 解析及答案&#xff1a; 关于 Oracle 数据库中的索引及其管理&#xff0c;以下哪三个陈述是正确的&#x…

脑机接口、嵌入式 AI 、工业级 MR、空间视频和下一代 XR 浏览器丨RTE2024 空间计算和新硬件专场回顾

这一轮硬件创新由 AI 引爆&#xff0c;或许最大受益者仍是 AI&#xff0c;因为只有硬件才能为 AI 直接获取最真实世界的数据。 在人工智能与硬件融合的新时代&#xff0c;实时互动技术正迎来前所未有的创新浪潮。从嵌入式系统到混合现实&#xff0c;从空间视频到脑机接口&…

Element UI如何实现按需导入--Vue3篇

前言 在使用 Element UI 时&#xff0c;按需导入&#xff08;即按需引入&#xff09;是一个常见的需求&#xff0c;尤其是在构建大型应用时。按需导入可以显著减少打包后的文件体积&#xff0c;提升应用的加载速度。本文将详细介绍如何在项目中实现 Element UI 的按需导入&…

【设计模式】行为型模式(五):解释器模式、访问者模式、依赖注入

《设计模式之行为型模式》系列&#xff0c;共包含以下文章&#xff1a; 行为型模式&#xff08;一&#xff09;&#xff1a;模板方法模式、观察者模式行为型模式&#xff08;二&#xff09;&#xff1a;策略模式、命令模式行为型模式&#xff08;三&#xff09;&#xff1a;责…