Spring事务学习总结

简介: Spring通过`@Transactional`注解实现事务管理,应用于Service层,支持事务的开启、提交与回滚。支持多种事务属性,如回滚规则、传播行为等,常用传播行为为REQUIRED和REQUIRES_NEW,确保数据一致性与业务逻辑隔离。

Spring事务管理

注解

  • 注解: @Transactional
  • 位置: 业务(service)层的方法上、类上、接口上,而不是业务层的实现类
  • 作用: 将当前方法交给spring进行事务管理,方法执行前,开启事务;成功执行完毕,提交事务;出现异常,回滚事务

代码实践

@Transactional
@Override
public void delete(Integer id) {
   
    //1. 删除部门
    deptMapper.delete(id);
    int i = 1/0; //模拟抛出异常
    //2. 根据部门id,删除部门下的员工信息
    empMapper.deleteByDeptId(id);
}

// 部门接口类
@Transactional
public interface DeptService {
   
    // CODE...
}

// 部门接口实现类
@Transactional
@Service
public class DeptServiceImpl implements DeptService {
   
    // CODE...
}

Spring中配置开启事务管理日志,开启之后可以在调试窗口看到事务

# 开启事务管理日志
logging:
  level:
    org.springframework.jdbc.support.JdbcTransactionManager: debug

事务角色

事务管理员:发起事务时,在Spring中通常指代业务层开启事务的方法,负责发起事务,决定事务的开始与提交/回滚

事务协调员:加入事务后,在Spring中通常指代数据层方法,也可以是业务层方法,负责参与已有事务,在事务中执行具体的数据库操作或业务逻辑。

角色 含义 在 Spring 中的对应 举例
事务管理员(Transaction Initiator) 负责发起事务,决定事务的开始与提交/回滚。 通常指 业务层方法(Service 层) 上声明了 @Transactional 且事务传播行为为 REQUIRED(默认)。 UserService.saveUser() 开启事务,调用 DAO 层操作。
事务协调员(Transaction Participant) 负责参与已有事务,在事务中执行具体的数据库操作或业务逻辑。 通常是 数据访问层(DAO 层) 或其他 被同一事务包裹的业务方法。 这些方法通常也是 @Transactional(propagation = REQUIRED)SUPPORTS,从而加入现有事务 UserRepository.insert() 在已有事务中执行 SQL,不单独提交。

示例代码:

@Service
public class UserService {
   

    @Autowired
    private UserRepository userRepository;
    @Autowired
    private LogService logService;

    @Transactional // 事务管理员
    public void registerUser(User user) {
   
        userRepository.save(user);   // 事务协调员
        logService.logRegistration(user); // 若 logService 使用 REQUIRED,也为协调员
    }
}

@Service
public class LogService {
   

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void logRegistration(User user) {
   
        // 新事务,成为自己的事务管理员
        // 不影响外层 registerUser() 的事务
    }
}

事务属性--回滚

rollbackFor

默认情况下,只有出现 RuntimeException 才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。

@Transactional(rollbackFor = Exception.class) // 回滚
default boolean saveBatch(Collection<T> entityList) {
   
    return saveBatch(entityList, DEFAULT_BATCH_SIZE);
}

表格一览

属性 作用 示例
readOnly 设置是否为只读事务 readOnly=true 只读事务
timeout 设置事务超时时间 timeout = -1(永不超时)
rollbackFor 设置事务回滚异常(class) rollbackFor = {NullPointerException.class}
rollbackForClassName 设置事务回滚异常(String) 同上格式为字符串
noRollbackFor 设置事务不回滚异常(class) noRollbackFor = {NullPointerException.class}
noRollbackForClassName 设置事务不回滚异常(String) 同上格式为字符串
propagation 设置事务传播行为 ……

事务属性--传播行为

属性值 含义
REQUIRED 【默认值】需要事务,有则加入,无则创建新事务
REQUIRES_NEW 需要新事务,无论有无,总是创建新事务
SUPPORTS 支持事务,有则加入,无则在无事务状态中运行
NOT_SUPPORTED 不支持事务,在无事务状态下运行,如果当前存在已有事务,则挂起当前事务
MANDATORY 必须有事务,否则抛异常
NEVER 必须没事务,否则抛异常
NESTED 如果当前事务存在,则在嵌套事务中执行,内层事务以来外层事务,如果外层失败,则会回滚内层,内层失败不影响外层。

代码实践

@Transactional
public void a() {
   
    //......
    userService.b();
    //......
}

@Transactional(propagation = Propagation.REQUIRED)
public void b() {
   
    //......
}

常用事务传播行为

REQUIRED:大部分情况下都是用该传播行为即可。

REQUIRES_NEW:当我们不希望事务之间相互影响时,可以使用该传播行为。比如:下订单前需要记录日志,不论订单保存成功与否,都需要保证日志记录能够记录成功。

相关文章
|
数据可视化 Java Nacos
OpenFeign + Sentinel 实现微服务熔断限流实战
本文介绍如何在Spring Cloud微服务架构中,结合OpenFeign与阿里巴巴开源组件Sentinel,实现服务调用的熔断、降级与限流。通过实战步骤搭建user-service与order-service,集成Nacos注册中心与Sentinel Dashboard,演示服务异常熔断、QPS限流控制,并支持自定义限流响应。借助Fallback降级机制与可视化规则配置,提升系统稳定性与高可用性,助力构建健壮的分布式应用。
448 155
|
监控 Java Spring
AOP 是什么?一文带你彻底搞懂面向切面编程
本文带你深入理解AOP(面向切面编程),通过Spring Boot实战实现日志、异常、性能监控等通用功能的统一处理。无需修改业务代码,5步完成方法日志切面,解耦横切关注点,提升代码可维护性,真正实现无侵入式增强。
550 5
|
Java API 安全
Java 8 十大新特性详解:Lambda、Stream、Optional 一网打尽
Java 8 十大新特性全面解析,涵盖Lambda表达式、Stream API、Optional类、接口默认方法等核心内容。通过丰富代码示例,深入讲解函数式编程、流式操作、空值安全处理等现代Java开发关键技术,助你提升代码质量与开发效率。
366 0
|
26天前
|
JSON 关系型数据库 MySQL
MySQL5.X和8.0有什么区别?
MySQL 8.0 相比 5.7 性能提升显著,支持 NoSQL、窗口函数、CTE、降序索引与隐藏索引,增强 JSON 处理,取消查询缓存以优化性能,默认使用 utf8mb4 编码,提升安全性、可靠性与高可用性,全面支持 ACID 事务和原子 DDL 操作。
99 5
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
AI内容创作Agent架构解析:基于移动端原生框架的内容特工队AI (ReelsAgent)与传统短视频工具的技术差异
传统的AI视频工具链往往基于单点功能堆栈或PC/Web端的SaaS架构,难以承载短视频营销所需的高频、高并发、全流程自动化需求。本文将从AI Agent系统架构角度,对比内容特工队AI (ReelsAgent)的移动端原生设计与现有主流工具的实现路径,以评估其在工程实践中的优劣。
234 7
|
1月前
|
Web App开发 运维 安全
2025年十大远程控制软件专业横评:十大主流工具深度解析与选型建议
2025年十大远程控制软件深度横评:从性能、画质、功能、跨平台及体验五大维度,全面解析连连控、AnyDesk、TeamViewer等主流工具。专业用户如何选?本文揭晓综合实力最强之选,助你高效远程协作。
|
2月前
|
负载均衡 Java API
《服务治理》RPC详解与实践
RPC是微服务架构的核心技术,实现高效远程调用,具备位置透明、协议统一、高性能及完善的服务治理能力。本文深入讲解Dubbo实践,涵盖架构原理、高级特性、服务治理与生产最佳实践,助力构建稳定可扩展的分布式系统。(238字)
|
存储 安全 数据安全/隐私保护
Token 是什么?全面解析身份认证中的 Token 机制
本文全面解析Token在身份认证中的核心机制,涵盖JWT、Session Token、OAuth等类型,深入讲解其工作原理、安全性策略、生命周期管理及实际应用场景,助力开发者构建安全高效的现代Web应用认证体系。
1705 3
|
1月前
|
存储 人工智能 安全
做了半年自动化后,我才发现飞书多维表格解决的不是表格问题
飞书多维表格是自动化利器,无需代码即可实现数据收集、存储与流程触发。它与n8n无缝对接,表单提交自动触发工作流,数据实时同步,既是起点也是终点,真正实现高效协作与全自动处理,让复杂变简单。
|
2月前
|
Web App开发 缓存 监控
内存溢出与内存泄漏:解析与解决方案
本文深入解析内存溢出与内存泄漏的区别及成因,结合Java代码示例展示典型问题场景,剖析静态集合滥用、资源未释放等常见原因,并提供使用分析工具、优化内存配置、分批处理数据等实用解决方案,助力提升程序稳定性与性能。
703 1

热门文章

最新文章