springboot+mybatis进行普通事务操作transaction

news2025/2/13 9:57:26

文章目录

  • 背景
  • 前置环境准备
  • 关于 configuration 代码
  • 关于 transaction 使用
  • 其他

背景

你使用 springboot 和 mybatis/mybatis plus 来进行 web 开发,但是你发现你需要使用到事务操作

前置环境准备

首先你得在 application.yml 中配置好 mysql 数据源,这个我在其他博文中有写

然后你得在 application.yml 中配置好 mybatis 配置,这个我在其他博文中有写

关于 configuration 代码

通常来说,常规业务开发中,application.yml 中配置了一个 mysql 数据源,也配置 mybatis 的常规配置即可,然后想要开启事务操作可以直接在 service 指定方法上方加上 @Transactionl 即可让此方法开通事物操作了,而不用去自定义 Configuration 来配置事物操作

如果你要自定义也可以,或者如果你使用多 mysql 多个数据源,你可能会在 application.yml 中配置多个 mysql 数据源,那么你就需要指定哪个数据源对应哪个事物操作 transactionManager 了,具体看下面代码

// 数据源 1 对应的配置
@Configuration  
@EnableTransactionManagement  
@MapperScan(basePackages = "com.example.primary.mapper", sqlSessionFactoryRef = "primarySqlSessionFactory")  
public class PrimaryDataSourceConfig {  
 
    @Primary  
    @Bean(name = "primaryDataSource")  
    @ConfigurationProperties(prefix = "spring.datasource.primary")  
    public DataSource primaryDataSource() {  
        return DataSourceBuilder.create().build();  
    }  
 
    @Primary  
    @Bean(name = "primarySqlSessionFactory")  
    public SqlSessionFactory primarySqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {  
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();  
        sessionFactoryBean.setDataSource(dataSource);  
        return sessionFactoryBean.getObject();  
    }  
 
 	// 事务管理器
    @Primary  
    @Bean(name = "primaryTransactionManager")
    public DataSourceTransactionManager primaryTransactionManager(@Qualifier("primaryDataSource") DataSource dataSource) {  
        return new DataSourceTransactionManager(dataSource);  
    }  
}  

// 数据源 2 对应的配置
@Configuration  
@EnableTransactionManagement  
@MapperScan(basePackages = "com.example.secondary.mapper", sqlSessionFactoryRef = "secondarySqlSessionFactory")  
public class SecondaryDataSourceConfig {  
 
    @Bean(name = "secondaryDataSource")  
    @ConfigurationProperties(prefix = "spring.datasource.secondary")  
    public DataSource secondaryDataSource() {  
        return DataSourceBuilder.create().build();  
    }  
 
    @Bean(name = "secondarySqlSessionFactory")  
    public SqlSessionFactory secondarySqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {  
        SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();  
        sessionFactoryBean.setDataSource(dataSource);  
        return sessionFactoryBean.getObject();  
    }  
 
 	// 事务管理器
    @Bean(name = "secondaryTransactionManager") 
    public DataSourceTransactionManager secondaryTransactionManager(@Qualifier("secondaryDataSource") DataSource dataSource) {  
        return new DataSourceTransactionManager(dataSource);  
    }  
}

关于 transaction 使用

@Transactionl 标记的表示默认会使用主数据源的事务管理器

如果你是 mysql 单个数据源,一旦配置好 yml 中的 msyql 和 mybatis 之后,一般对 Service 中的方法上头加上 @Transactional 就可以直接对其开启事务了(通常情况),使用上 @Transactional 表示该方法中如果抛出未捕获的异常时就会触发回滚,这样的异常是 RuntimeException 以及子类或者 error 错误时能回滚,如果是 IOException SQLException 等异常不会回滚。并且方法中如果你 try catch 了这个异常,catch 后不再往外抛出就不会触发回滚,如果再往外抛出还会回滚。发生回滚不只是 try catch 中的,而是整个方法内该 transactionManager 事务管理器对应的数据源的数据库操作都会回滚

@Service  
public class SomeService {  
  
    @Autowired  
    private SomeMapper someMapper; // 假设这个Mapper使用的是ds1数据源  
  
    @Transactional
    public void someTransactionalMethod() {  
        // 这里的方法调用将会使用ds1数据源的事务管理器  
        someMapper.updateSomething();  
    }  
}

如果是 mysql 多数据源,一般会像上头配置 Configuration 代码,指定不同数据源对应的事务管理器叫啥,因此你使用事务时候会指定哪个 transactionManager

@Service  
public class SomeService {  
  
    @Autowired  
    private SomeMapper someMapper; // 假设这个Mapper使用的是ds1数据源  
  
    // 指定 transactionManager
    @Transactional(transactionManager = "secondaryTransactionManager")  
    public void someTransactionalMethod() {  
        // 这里的方法调用将会使用ds1数据源的事务管理器  
        someMapper.updateSomething();  
    }  
}

如果你的 servive 中的一个方法会操作多个数据源,这个方法操作抛出异常时候,需要让多个数据都回滚,该怎么做呢?一般业务上会采用分布式事务使用 JTA(Atomikos),我的其他博文有写,安全性低一些的可以考虑使用 Spring 框架提供的一种用于管理多数据源事务的方法 ChainedTransactionManager 来简单替代

其他

如果你不希望 service 方法中抛出异常的时候才回滚,你希望如果走到某种逻辑时候也能回滚,你也可以手动提交事务,等同于替代了 @Transactional

@Service  
public class MyService {  
  
    @Autowired  
    private DataSourceTransactionManager transactionManager; // 或者 PlatformTransactionManager  
  
    // ... 其他业务方法 ...  
  
    public void performManualTransaction() {  
        // 定义一个事务属性  
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();  
        def.setName("MyManualTransaction");  
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);  
          
        // 获取事务状态  
        TransactionStatus status = transactionManager.getTransaction(def);  
  
        try {  
            // 执行数据库操作  
            myMapper.updateSomething();  
              
            // 执行其他数据库操作或业务逻辑  
            // ...  
  
            // 如果没有异常,提交事务  
            transactionManager.commit(status);  
        } catch (Exception ex) {  
            // 发生异常时,回滚事务  
            transactionManager.rollback(status);  
            // 记录日志或执行其他异常处理逻辑  
            // ...  
            throw ex; // 可以选择重新抛出异常或进行其他处理  
        }  
    }  
}

如果你使用 mybatis 这个 ORM 框架,你可能没有使用 springboot 的能力,那么该怎么做呢?你通过代码方式生成 SqlSession 时候会指定是否要开启事务,对于开启事务的 sqlSession 你需要手动 commit 提交,和 rollback

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

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

相关文章

MybatisPlus常用增删改查

记录下MybatisPlus的简单的增删改查 接口概述 Service和Mapper区别 Mapper简化了单表的sql操作步骤(CRUD),而Serivce则是对Mapper的功能增强。 Service虽然加入了数据库的操作,但还是以业务功能为主,而更加复杂的SQL…

常用电路(过压保护、电流/电压采集)

过压保护电路 输入电压使用电源(36V)或者typec(20V),需要过压保护电路处理输入再连接到CH224K,保证输入不高于最大获取电压20V MOS管导通条件为栅源极有压差,一般为5-10V 三极管导通条件为基极…

干部监督系统“三色”预警的构建与应用

在新时代背景下,强化干部监督、提升管理水平已成为推动国家治理体系和治理能力现代化的关键一环。干部监督系统“三色”预警机制作为一种创新的管理工具,通过智能化、可视化的手段,实现了对干部行为的高效管理。本文将详细探讨干部监督系统“…

Zabbix-Trigger中的time函数坑

问题描述 由于功能需求&#xff0c;需要限制trigger的报警时间&#xff0c;所以加了如下的报警限制 and (time()>010000 and time()<045959)但是事与愿违&#xff0c;报警的时间总是对不上 但是&#xff0c;Zabbix设置的时区就是北京时间&#xff0c;应该是没有问题的…

9 数据流图

9 数据流图 9.1数据平衡原则 子图缺少处理后的数据操作结果返回前端应用以及后端数据库返回操作结果到数据管理中间件。 9.2解题技巧 实件名 存储名 加工名 数据流

python项目相关

遇到的问题 解决 Python 模块导入路径问题 问题描述 在运行 Python 文件时&#xff0c;可能会遇到以下错误&#xff1a; ModuleNotFoundError: No module named utils原因&#xff1a; Python 的模块导入机制依赖于当前工作目录和 sys.path 中的路径。当直接运行某个文件时…

基于轨道角动量自由度在空间频域中的可选择特性

将光的轨道角动量自由度应用到全息领域&#xff0c;证实了轨道角动量全息&#xff1b;实现了高维轨道角动量复用全息技术&#xff0c;获得了高安全的全息加密和超高容量全息信息系统。 1、轨道角动量自由度在全息中的引入 如图1所示&#xff0c;当全息图中没有携带轨道角动量的…

机器人学的AGI实现路径:从专用智能到通用认知的跨越

文章目录 引言:机器人学的范式革命一、AGI与机器人学的融合现状1.1 传统机器人系统的局限1.2 AGI技术为机器人学带来的变革1.3 关键里程碑案例二、AGI机器人的核心技术栈2.1 多模态感知融合2.2 认知架构设计2.3 具身认知实现路径三、AGI机器人的实现路径3.1 阶段式发展路线3.2…

香港中文大学 Adobe 推出 MotionCanvas:开启用户掌控的电影级图像视频创意之旅。

简介&#xff1a; 亮点直击 将电影镜头设计引入图像到视频的合成过程中。 推出了MotionCanvas&#xff0c;这是一种简化的视频合成系统&#xff0c;用于电影镜头设计&#xff0c;提供整体运动控制&#xff0c;以场景感知的方式联合操控相机和对象的运动。 设计了专门的运动条…

基于STM32的学习环境控制系统设计

&#x1f91e;&#x1f91e;大家好&#xff0c;这里是5132单片机毕设设计项目分享&#xff0c;今天给大家分享的是学习环境控制。 设备的详细功能见网盘中的文章《21、基于STM32的学习环境控制系统设计》&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1uWSZX2zbZwy9sY…

snort3.0-ubuntu18.04 64入侵检测安装与使用ailx10ailx10​​知乎知识会员

在日常生活中&#xff0c;很多人怀疑自己的手机、电脑被监控了&#xff0c;担心自己的隐私泄漏&#xff0c;实际上最佳的检测方式就是终端检测&#xff0c;也就是EDR&#xff0c;但是就是有那么多的人在网上大放厥词&#xff0c;说任何EDR杀毒软件都检测不到监控&#xff0c;毕…

使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器进行模型检查点处理

2023 年 11 月&#xff0c;Amazon 宣布推出适用于 PyTorch 的 S3 连接器。适用于 PyTorch 的 Amazon S3 连接器提供了专为 S3 对象存储构建的 PyTorch 数据集基元&#xff08;数据集和数据加载器&#xff09;的实现。它支持用于随机数据访问模式的地图样式数据集和用于流式处理…

408-数据结构

数据结构在学什么&#xff1f; 1.用代码把问题信息化 2.用计算机处理信息 ch1 数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 ch2 //假设线性表…

spring cloud 使用 webSocket

1.引入依赖,(在微服务模块中) <!-- Spring WebSocket --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency> 2.新建文件 package com.ruoyi.founda…

安科瑞 Acrel-2000ES:解锁储能管理新高度,引领能源未来!

安科瑞 崔丽洁 在能源转型的关键时期&#xff0c;高效的储能管理成为众多企业和项目的核心需求。今天&#xff0c;就给大家介绍一款储能管理的 “神器”—— 安科瑞 Acrel-2000ES 储能能量管理系统。 安科瑞电气可是行业内的 “明星企业”&#xff0c;2003 年成立&#xff0c;2…

基于Django以及vue的电子商城系统设计与实现

基于Django以及vue的电子商城系统设计与实现 引言 随着电子商务的快速发展&#xff0c;越来越多的企业和个人选择搭建线上商城&#xff0c;以提供更加便捷的购物体验。本文基于Python开发了一套电子商城系统&#xff0c;后端采用Django框架&#xff0c;前端使用Vue.js&#x…

电脑变慢、游戏卡顿,你的SSD固态可能快坏了!

电脑用久了&#xff0c;很多人都会感觉速度变慢&#xff0c;开机变慢、文件复制时间变长&#xff0c;甚至莫名其妙的卡顿。你可能怀疑是系统问题&#xff0c;或者内存不够&#xff0c;但往往被忽略的一个关键因素——你的硬盘&#xff0c;可能正在悄悄老化。 硬盘寿命不是永久的…

AI使用场景简单测试

前言 今天来分享下AI的2个实用场景&#xff0c;我这里是使用的博主&#xff1a;小虚竹&#xff0c;搭建的AI服务&#xff0c;用的ChatGPT 4O模型&#xff0c;主要是试了3个场景&#xff0c;服装设计、直播带货话术、检验报告分析。 一、服装设计 对于最后需要的裁片设计上的尺寸…

【并发控制、更新、版本控制】.NET开源ORM框架 SqlSugar 系列

系列文章目录 &#x1f380;&#x1f380;&#x1f380; .NET开源 ORM 框架 SqlSugar 系列 &#x1f380;&#x1f380;&#x1f380; 文章目录 系列文章目录一、并发累计&#xff08;累加&#xff09;1.1 单条批量累计1.2 批量更新并且字段11.3 批量更新并且字段list中对应的…

DeepSeek-R1本地搭建

1. 前言 现在deepseek火上天了&#xff0c;因为各种应用场景,加上DeepSeek一直网络异常&#xff0c;所以本地部署Deepseek成为大家的另一种选择。 目前网络上面关于DeepSeek的部署方式有很多&#xff0c;但是太麻烦了&#xff0c;本文是一篇极为简单的DeepSeek本地部署方式&…