当前位置: 首页 > news >正文

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.cnnetsun.cn/news/506033.html

相关文章:

  • 鸿蒙PC上Electron原生应用开发:从零到部署的实战避坑指南
  • 鸿蒙PC开发指南:从零配置Qt环境到实战部署完整流程
  • 前后端分离海滨体育馆管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 二十三种设计模式(二十二)--策略模式
  • Java SpringBoot+Vue3+MyBatis 学科竞赛管理系统源码|前后端分离+MySQL数据库
  • 大数据领域数据架构的发展趋势洞察
  • Apache Paimon多模态数据湖实践:从结构化到非结构化的技术演进
  • 开源版 Manus 火爆全网,狂揽 7.5 万 GitHub Star!
  • MATLAB实现大规模K-means聚类并保存分区结果到二进制文件
  • MATLAB实现图正则化稀疏编码的系数求解:Feature-Sign Search算法详解
  • 28.useMutationObserver
  • 精通plotnine:仅为特定数据组添加误差条
  • 提示工程架构师的“用户调研方法“:如何获取有效的Prompt设计需求
  • UE5 C++(15):宏 UFUNCTION() 修饰成员函数,BlueprintCallable,Category,BlueprintPure 纯函数,
  • [特殊字符]_网络IO性能优化:从TCP到HTTP的层层优化[20260108163835]
  • 注意,科学家、数学家不一定是智能学家
  • 【确认出席】叶光辉 盐城市住房公积金管理中心技术信息处副处长丨上海·1月14日
  • 全渠道 AI 推荐,如何终结创作者的“效率焦虑”?
  • Soundflower音频路由神器:彻底释放Mac音频系统的无限潜能
  • 谁说思维链越长越好?Yuan3.0 Flash开源:砍掉70%无效token,重构推理范式
  • WE Learn AI学习助手终极指南:5步轻松开启智能学习模式
  • Diffusers库安装
  • 巴菲特-芒格的神经形态计算投资:类脑计算的未来
  • 【2025最新高维多目标优化】基于城市场景下无人机三维路径规划的导航变量的多目标粒子群优化算法NMOPSO研究(Matlab代码实现)
  • Node.js 用beforeExit优雅关闭应用
  • Python纪念币预约自动化系统架构设计与实现
  • Soundflower音频路由:解锁Mac音频系统的隐藏潜能
  • Androidstudio成品项目-记单词背单词系统
  • C语言里面的中断程序:“exit()”和“return返回”
  • Soundflower终极指南:5步掌握Mac音频路由神器