spring 中 @Transactional 的传递性
时间: 2023-12-29 12:26:42 浏览: 154
spring的@Transactional注解用法解读
@Transactional注解用于声明一个方法或类需要在事务中执行。它可以应用于方法级别或类级别。当@Transactional注解应用于类级别时,它将应用于该类中的所有公共方法。
@Transactional注解具有传播属性,用于控制事务的传播行为。传播属性定义了一个方法在调用另一个带有事务的方法时如何处理事务。以下是几种常见的传播属性:
1. REQUIRED(默认):如果当前没有事务,则创建一个新的事务。如果已经存在一个事务,则加入该事务。这是最常用的传播属性。
2. REQUIRES_NEW:创建一个新的事务,并挂起当前事务(如果存在)。在新的事务中执行方法,如果存在嵌套事务,则将其挂起。
3. SUPPORTS:如果当前存在事务,则加入该事务。如果没有事务,则以非事务方式执行方法。
4. NOT_SUPPORTED:以非事务方式执行方法。如果当前存在事务,则将其挂起。
5. MANDATORY:如果当前存在事务,则加入该事务。如果没有事务,则抛出异常。
6. NEVER:以非事务方式执行方法。如果当前存在事务,则抛出异常。
7. NESTED:如果当前存在事务,则在嵌套事务中执行方法。如果没有事务,则创建一个新的事务。
下面是一个示例,演示了@Transactional注解的传播性:
```java
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional(propagation = Propagation.REQUIRED)
public void saveUser(User user) {
// 保存用户信息
userRepository.save(user);
// 调用另一个带有事务的方法
updateUserStatus(user.getId());
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUserStatus(Long userId) {
// 更新用户状态
userRepository.updateStatus(userId);
}
}
```
在上面的示例中,saveUser方法使用了REQUIRED传播属性,它调用了updateUserStatus方法,该方法使用了REQUIRES_NEW传播属性。这意味着在saveUser方法中开启了一个事务,如果updateUserStatus方法已经存在一个事务,则会挂起该事务并创建一个新的事务。
阅读全文