springboot事务触发滚动与不滚蛋

事务触发滚动与不滚蛋

代码:

MyBatisConfig 类

package org.example.testproduct; import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; @Configuration //@EnableTransactionManagement public class MyBatisConfig { private final DataSource dataSource; public MyBatisConfig(DataSource dataSource) { this.dataSource = dataSource; } @Bean public SqlSessionFactory sqlSessionFactory() throws Exception { System.out.println("dataSource1 = " + dataSource); // 使用MyBatis-Plus提供的SqlSessionFactoryBean MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); // 移除对XML映射文件的依赖,MyBatis-Plus可以自动生成SQL return factoryBean.getObject(); } @Bean public PlatformTransactionManager transactionManager() { System.out.println("new DataSourceTransactionManager()"+new DataSourceTransactionManager(dataSource)); return new DataSourceTransactionManager(dataSource); } }

Order 类

package org.example.testproduct.order; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @Data @TableName("orders") public class Order { private Long id; private String orderNo; private Integer amount; }
OrderController类
package org.example.testproduct.order; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class OrderController { @Autowired private OrderService orderService; // 访问这个接口,事务会回滚 @GetMapping("/order/tx") public String orderWithTx() { try { orderService.createOrderWithTransaction(); } catch (Exception e) { return "Exception caught, transaction should rollback: " + e.getMessage(); } // orderService.createOrderWithTransaction(); return "ok"; } // 访问这个接口,事务不会回滚 @GetMapping("/order/notx") public String orderWithoutTx() { try { orderService.createOrderWithoutTransaction(); } catch (Exception e) { return "Exception caught, transaction will NOT rollback: " + e.getMessage(); } return "ok"; } }

OrderMapper 接口

package org.example.testproduct.order; import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface OrderMapper extends BaseMapper<Order> { }

OrderService 类

package org.example.testproduct.order; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class OrderService { @Autowired private OrderMapper orderMapper; // 这个方法有事务 @Transactional public void createOrderWithTransaction() { Order order = new Order(); order.setOrderNo("ORD-TX-" + System.currentTimeMillis()); order.setAmount(100); orderMapper.insert(order); // 制造异常 int x = 1 / 0; } // 这个方法没有事务 public void createOrderWithoutTransaction() { Order order = new Order(); order.setOrderNo("ORD-NO-" + System.currentTimeMillis()); order.setAmount(200); orderMapper.insert(order); // 制造异常 int x = 1 / 0; } }

依赖:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>4.0.1</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.example</groupId> <artifactId>testproduct</artifactId> <version>0.0.1-SNAPSHOT</version> <name>testproduct</name> <description>testproduct</description> <url/> <licenses> <license/> </licenses> <developers> <developer/> </developers> <scm> <connection/> <developerConnection/> <tag/> <url/> </scm> <properties> <java.version>17</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!-- MySQL JDBC 驱动 --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-spring-boot3-starter --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.9</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

运行效果:

用apifox插件检查接口。

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

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

相关文章

​ ⛳️赠与读者[特殊字符]1 概述基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法(NMOPSO)研究摘要随着无人机应用场景的复杂化,城市场景下的三维路径规划需同时优化

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Python 内置函数:那些你见过但未必真正了解的“老朋友“

一、bin()&#xff1a;数字的"二进制身份证" 基本用法&#xff1a; # 将整数转换为二进制字符串 print(bin(10)) # 0b1010 print(bin(255)) # 0b11111111实际应用场景&#xff1a; # 1. 权限系统&#xff1a;用二进制位表示权限 READ_PERMISSION 0b001 # 1 WRIT…

鸿蒙PC上Qt原生应用开发:从零搭建开发环境到部署实战,附HarmonyOS SDK配置与避坑指南(C++实现)

鸿蒙PC上Qt原生应用开发&#xff1a;从零搭建开发环境到部署实战&#xff0c;附HarmonyOS SDK配置与避坑指南&#xff08;C实现&#xff09;摘要&#xff1a;本文记录了我在鸿蒙PC平台上开发Qt原生应用的完整实战过程。通过两周的深度适配&#xff0c;成功将Qt6.7应用迁移到Ope…

鸿蒙PC Qt开发环境配置全攻略:从零搭建到第一个原生应用实战

鸿蒙PC Qt开发环境配置全攻略&#xff1a;从零搭建到第一个原生应用实战摘要&#xff1a;本文详细记录在鸿蒙PC环境下搭建Qt开发环境的完整过程&#xff0c;从开发机选择到环境配置&#xff0c;再到首个原生应用的开发与部署实战。内容涵盖鸿蒙PC特性解析、Qt框架适配要点、分布…

基于Java+SpringBoot+SSM合同信息管理系统(源码+LW+调试文档+讲解等)/合同管理信息系统/合同信息管理平台/合同管理系统/信息管理系统/合同管理软件/合同资料管理系统

博主介绍 &#x1f497;博主介绍&#xff1a;✌全栈领域优质创作者&#xff0c;专注于Java、小程序、Python技术领域和计算机毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2025-2026年最新1000个热门Java毕业设计选题…

鸿蒙PC开发指南:从零配置Qt环境到实战部署完整流程

鸿蒙PC开发指南&#xff1a;从零配置Qt环境到实战部署完整流程摘要&#xff1a;本文将以第一人称视角记录在开源鸿蒙PC平台上从零搭建Qt开发环境到实战部署的全过程。你将获得&#xff1a;鸿蒙PC开发环境配置的保姆级教程、Qt应用迁移的核心适配方案、解决跨平台兼容性问题的实…

鸿蒙PC版Electron开发指南:手把手教你搭建环境并打包跨端应用

鸿蒙PC版Electron开发指南&#xff1a;手把手教你搭建环境并打包跨端应用 摘要&#xff1a;本文为开发者提供鸿蒙PC平台上的Electron应用开发完整解决方案。通过实战案例&#xff0c;你将掌握Electron应用在OpenHarmony PC环境的适配要点、环境搭建全流程、API兼容性处理技巧&a…

鸿蒙PC上Electron原生应用开发:从零到部署的实战避坑指南

鸿蒙PC上Electron原生应用开发&#xff1a;从零到部署的实战避坑指南摘要&#xff1a;本文记录了笔者将Electron应用迁移至开源鸿蒙PC平台的全过程。通过真实项目案例&#xff0c;详解Electron与鸿蒙Native API的融合方案&#xff0c;涵盖环境搭建、窗口管理、剪贴板适配等核心…

从零到一:基于Qt on HarmonyOS的鸿蒙PC原生应用开发实战与性能优化指南

从零到一&#xff1a;基于Qt on HarmonyOS的鸿蒙PC原生应用开发实战与性能优化指南摘要&#xff1a;本文以真实项目迁移案例为背景&#xff0c;详细拆解Qt应用在开源鸿蒙PC平台的完整开发流程。你将获得&#xff1a;1&#xff09;鸿蒙PC开发环境搭建指南&#xff08;含DevEco S…

《实战指南:Electron框架鸿蒙PC化,跨端迁移的完整配置与核心代码解析》

实战指南&#xff1a;Electron框架鸿蒙PC化&#xff0c;跨端迁移的完整配置与核心代码解析 摘要&#xff1a;本文记录了将Electron应用迁移到鸿蒙PC平台的全过程&#xff0c;包含环境配置、架构适配、核心模块重构等关键技术细节。通过5个实战代码段和3个架构图&#xff0c;详细…

鸿蒙PC原生应用开发避坑指南:Qt 6.6与Electron 28兼容性问题全解析

鸿蒙PC原生应用开发避坑指南&#xff1a;Qt 6.6与Electron 28兼容性问题全解析 摘要&#xff1a;本文基于作者在鸿蒙PC平台的实际迁移经验&#xff0c;深度剖析Qt 6.6与Electron 28框架在鸿蒙PC环境下的兼容性问题。通过真实案例展示OpenGL渲染异常、Node.js模块加载失败等典型…

1. 数据存储结构

一、核心原理 1. 数据存储结构 // 每个 Thread 对象内部都有一个 ThreadLocalMap ThreadLocal.ThreadLocalMap threadLocals null; // ThreadLocalMap 内部使用 Entry 数组&#xff0c;Entry 继承自 WeakReference<ThreadLocal<?>> static class Entry extends…

实时数字信号处理——AM发射器

AM&#xff08;DSB-LC&#xff09;调制过程1. 引入与方法概述&#xff08;原文要点整理与解释&#xff09;原文&#xff08;要点&#xff09;&#xff1a;有几种方法可以产生 AM&#xff08;DSB-LC&#xff09;。一种特别容易解释的方法使用两个步骤&#xff1a; ① 通过添加 D…

在日常里也要制造积极情绪

有两种工程师。一种是技术很强,但总是自己闷头干活,遇到问题也不爱说。另一种技术可能差不多,但特别爱交流,碰到点小进展就要跟旁边的人分享一下。猜猜哪种人最后做得更好?debug是个特别磨人的活。有时候一个timing violation能让人盯着屏幕看一整天,脑子都要炸了。这时候,如果…

前后端分离海滨体育馆管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

&#x1f4a1;实话实说&#xff1a; CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…

墙绘产品展示交易平台信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…

5. enum(枚举)关键字在C/C++中的作用

enum&#xff08;枚举&#xff09;关键字本质是用来定义一组有名字的整数常量&#xff0c;替代直接使用魔法数字&#xff08;比如 0、1、2&#xff09;&#xff0c;让代码更易读、易维护。 1. 什么是enum&#xff1f;&#xff08;核心概念&#xff09; enum&#xff08;枚举类型…

包装对象揭秘:前端新人踩坑后才懂的JS冷知识

包装对象揭秘&#xff1a;前端新人踩坑后才懂的JS冷知识包装对象揭秘&#xff1a;前端新人踩坑后才懂的JS冷知识引言&#xff1a;我第一次看到 new String("hello") 的时候以为自己眼花了包装对象到底是个啥玩意儿基本类型怎么突然能调方法了&#xff1f;三大包装对象…

前后端分离Web足球青训俱乐部管理后台系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价。我就是个在校研究生&#xff0c;兼职赚点饭钱贴补生活费&…

基于SpringBoot+Vue的墙绘产品展示交易平台管理系统设计与实现【Java+MySQL+MyBatis完整源码】

&#x1f4a1;实话实说&#xff1a;CSDN上做毕设辅导的都是专业技术服务&#xff0c;大家都要生活&#xff0c;这个很正常。我和其他人不同的是&#xff0c;我有自己的项目库存&#xff0c;不需要找别人拿货再加价&#xff0c;所以能给到超低价格。摘要 随着文化创意产业的蓬勃…