乐趣区

关于后端:面试题精讲SpringBoot的传播机制详解

首发博客地址

系列文章地址


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 注解,咱们能够不便地管制事务的流传行为,实现对数据库操作的事务管理。

本文由 mdnice 多平台公布

退出移动版