【面试题精讲】SpringBoot的传播机制详解

首发博客地址[1]

系列文章地址[2]


Spring Boot 是基于 Spring 框架的快速开发框架,提供了许多便捷的特性和机制来简化开发过程。在 Spring Boot 中,事务的传播机制是通过@Transactional 注解来实现的。

@Transactional 注解可以用于方法、类或接口上,用于标识方法或类中的所有方法需要进行事务管理。通过设置@Transactional 注解的 propagation 属性,可以指定事务的传播行为。

事务的传播行为分为以下几种:

  1. REQUIRED:表示当前方法必须在一个事务内运行。如果当前已经存在事务,则加入该事务;如果当前不存在事务,则创建一个新的事务。
  2. SUPPORTS:表示当前方法支持事务。如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务方式运行。
  3. MANDATORY:表示当前方法必须在一个事务内运行。如果当前不存在事务,则抛出异常。
  4. REQUIRES_NEW:表示当前方法必须在一个新的事务内运行。如果当前存在事务,则挂起该事务并创建一个新的事务。
  5. NOT_SUPPORTED:表示当前方法不支持事务。如果当前存在事务,则挂起该事务。
  6. NEVER:表示当前方法不支持事务。如果当前存在事务,则抛出异常。
  7. NESTED:表示当前方法必须在一个嵌套事务内运行。如果当前存在事务,则在嵌套事务内运行;如果当前不存在事务,则创建一个新的事务。

下面是一个使用 Spring Boot 传播机制的示例:

复制代码
@Service
@Transactional(propagation = Propagation.REQUIRED)
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public void createUser(User user) {
        // 保存用户信息
        userRepository.save(user);

        // 调用其他方法,如果其他方法也有@Transactional注解,则会参与到当前事务中
        updateUserStatus(user.getId());
    }

    @Transactional(propagation = Propagation.REQUIRED)
    public void updateUserStatus(Long userId) {
        // 更新用户状态
        userRepository.updateStatus(userId);
    }
}

在上面的示例中,UserService 类的 createUser 方法使用了@Transactional 注解,并设置了传播行为为 REQUIRED,表示该方法必须在一个事务内运行。在该方法中,先保存用户信息到数据库,然后调用了 updateUserStatus 方法。由于 updateUserStatus 方法也使用了@Transactional 注解,并且传播行为也为 REQUIRED,所以它会参与到当前事务中,保证了两个方法的操作在同一个事务内执行。

通过使用@Transactional 注解,我们可以方便地控制事务的传播行为,实现对数据库操作的事务管理。

参考资料

1

首发博客地址: https://blog.zysicyj.top/

2

系列文章地址: https://blog.zysicyj.top/categories/技术文章/后端技术/系列文章/面试题精讲/

本文由mdnice多平台发布

相关推荐
用户21411832636021 天前
Qwen3-Coder 实战!历史人物短视频一键生成,多分镜人物不崩,魔搭直接玩
后端
追逐时光者1 天前
C#/.NET/.NET Core技术前沿周刊 | 第 54 期(2025年9.8-9.14)
后端·.net
追逐时光者1 天前
C#/.NET/.NET Core编程技巧练习集,配套详细的文章教程讲解!
后端·.net
AD钙奶-lalala1 天前
SpringBoot实现WebSocket服务端
spring boot·后端·websocket
moxiaoran57531 天前
Flask学习笔记(一)
后端·python·flask
你的人类朋友1 天前
🔒什么是HMAC
后端·安全·程序员
盖世英雄酱581361 天前
Read timed out问题 排查
java·数据库·后端
BXCQ_xuan1 天前
软件工程实践二:Spring Boot 知识回顾
java·spring boot·后端
o0o_-_1 天前
【go/gopls/mcp】官方gopls内置mcp server使用
开发语言·后端·golang
苏三说技术1 天前
为什么不建议在 Docker 中跑 MySQL?
后端