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

Spring事物

文章目录

  • 为什么需要事务管理?
  • Spring事务的核心概念
    • 1. 事务传播行为
    • 2. 隔离级别
    • 3. 回滚规则
  • 如何配置Spring事务?
    • 使用@Transactional注解
  • 事务失效的常见场景
    • 1. 方法不是public的
    • 2. 同一个类内部方法调用
    • 3. 异常被捕获没抛出
    • 4. 数据库不支持事务
  • 总结

大家好,今天想和大家分享一下Spring框架中的事务管理。这东西在实际开发中超级实用,尤其是处理数据库操作的时候,能帮我们避免很多坑。

为什么需要事务管理?

首先,事务就是一组操作,要么全成功,要么全失败。比如你转账,从A账户扣钱,再给B账户加钱,这两个步骤必须一起完成,要是扣钱成功了加钱失败,那不就乱套了?在Spring里,事务管理主要针对数据库操作,但也能扩展到其他资源。Spring提供了两种方式:编程式事务声明式事务。编程式就是手动写代码控制事务开始、提交、回滚;声明式更方便,通过注解或XML配置,让Spring自动帮你管。

Spring事务的核心概念

1. 事务传播行为

传播行为决定了事务在方法嵌套调用时的行为。Spring定义了7种:

传播行为描述
REQUIRED如果当前有事务,就加入;没有就新建一个。最常用。
REQUIRES_NEW总是新建一个事务,挂起当前事务。
NESTED嵌套事务,类似于REQUIRES_NEW,但回滚时只影响子事务。
SUPPORTS有事务就加入,没有就非事务执行。
MANDATORY必须有事务,否则抛异常。
NOT_SUPPORTED非事务执行,如果有就挂起。
NEVER必须非事务,否则抛异常。

2. 隔离级别

Spring支持数据库的隔离级别:

隔离级别描述
DEFAULT用数据库默认的。
READ_UNCOMMITTED最低级别,可能脏读。
READ_COMMITTED避免脏读,但可能不可重复读。
REPEATABLE_READ避免不可重复读,但可能幻读。
SERIALIZABLE最高级别,完全串行,但性能差。

实际项目中,READ_COMMITTED够用了,除非有特殊需求。

3. 回滚规则

默认情况下,Spring只在RuntimeException时回滚,Checked Exception不会。你可以用@Transactional(rollbackFor = Exception.class)指定回滚的异常类型。

如何配置Spring事务?

Spring Boot时代,配置超级简单。主要用注解方式。

使用@Transactional注解

在Service方法上加:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)public void transferMoney(Long fromId, Long toId, BigDecimal amount) {User from = userRepository.findById(fromId).orElseThrow();User to = userRepository.findById(toId).orElseThrow();from.setBalance(from.getBalance().subtract(amount));to.setBalance(to.getBalance().add(amount));userRepository.save(from);userRepository.save(to);// 模拟异常int i = 10 / 0;}
}

这个例子中,如果抛异常,整个转账操作都会回滚。

事务失效的常见场景

1. 方法不是public的

Spring的事务是基于AOP代理实现的,默认只对public方法生效。如果你把@Transactional加在protected、private或package-private方法上,事务不会触发。

2. 同一个类内部方法调用

假如类A有方法foo()调用bar(),bar()有@Transactional,但因为没走代理(直接this.bar()),事务不生效。

解决方案

  • 在同一个类中不要用到内部方法调用
  • AopContext.currentProxy()走代理,但需@EnableAspectJAutoProxy(exposeProxy = true)。

3. 异常被捕获没抛出

@Transactional默认只在抛出RuntimeException时回滚。如果你try-catch了异常,没再抛,事务就提交了。

4. 数据库不支持事务

数据库不支持事务:如MyISAM引擎,用InnoDB。

总结

我在这篇文章中分享了Spring事务管理的实用经验,从为什么需要事务入手,解释了它如何确保操作的原子性,比如转账场景。接着,我详细介绍了核心概念,包括传播行为和隔离级别的表格展示,以及回滚规则。然后,我展示了如何用@Transactional注解配置事务,并举了转账代码例子。最后,我列出了事务失效的常见坑,如非public方法和类内调用问题,希望能帮大家在开发中避开雷区,更高效地处理数据库操作。

http://www.dtcms.com/a/332844.html

相关文章:

  • 如何理解AP中SM中宿主进程?
  • 艾伦·图灵:计算理论与人工智能的奠基人
  • 云原生俱乐部-k8s知识点归纳(4)
  • 数据结构初阶:排序算法(一)插入排序、选择排序
  • uniapp纯前端绘制商品分享图
  • 18- 网络编程
  • 【学习笔记】Java并发编程的艺术——第10章 Executor框架
  • 从PDF到洞察力:基于飞算JavaAI的智能文档分析引擎实战
  • canoe面板中的进度条的使用
  • 分享一个基于Hadoop的二手房销售签约数据分析与可视化系统,基于Python可视化的二手房销售数据分析平台
  • AI工作流入门指南:从概念到实践
  • Redis 缓存和 Redis 分布式锁
  • SpringCloud -- Nacos详细介绍
  • Vue3从入门到精通: 4.5 数据持久化与同步策略深度解析
  • 电工的基础知识以及仪器的使用
  • linux下用c++11写一个UDP回显程序
  • 什么是敏感内容识别技术?
  • 平替 Claude Code,API接入 GPT-5,Codex CLI 国内直接使用教程
  • linux-数据链路层
  • ChatGPT-5(GPT-5)全面解析:一场从通用智能迈向专属智能的进化风暴,正在重塑人类与机器的协作边界
  • 当 FastGPT 遇见 Doris:无需手写 SQL,丝滑实现自助 ChatBI
  • wordpress忘记密码怎么办
  • 开源数据发现平台:Amundsen Frontend Service 应用程序配置
  • 专题三_二分_在排序数组中查找元素的第一个和最后一个位置
  • Jeecg后端经验汇总
  • Java: Spring前端传递列表和数组限制大小256问题
  • Vue 3 的运行机制
  • 前端开发神器之 VS Code AI 辅助插件 Amazon Q
  • expand.exe命令为什么能显示CD.iso的版本信息?
  • vue3 wangeditor5 编辑器,使用方法