Spring 事务的传播行为 代码示例
时间: 2023-07-10 19:03:50 浏览: 105
Spring事务传播行为是指在某个事务方法调用另一个事务方法时,如何处理这两个事务之间的关系,常见的传播行为有以下几种:
1. REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。
2. SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
3. MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
4. REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
5. NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6. NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
7. NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则新建一个事务,并在新建的嵌套事务中执行。
下面是一个使用 Spring 事务传播行为的示例:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Transactional(propagation = Propagation.REQUIRED)
public void updateUserName(Long userId, String userName) {
User user = userDao.findUserById(userId);
if (user == null) {
throw new RuntimeException("User does not exist");
}
user.setUserName(userName);
userDao.updateUser(user);
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateUserNameWithNewTransaction(Long userId, String userName) {
updateUserName(userId, userName);
}
@Transactional(propagation = Propagation.NESTED)
public void updateUserNameWithNestedTransaction(Long userId, String userName) {
updateUserName(userId, userName);
}
}
```
在上面的示例中,我们定义了三个方法,分别使用不同的传播行为来更新用户姓名。其中,`updateUserName` 方法使用 `REQUIRED` 传播行为,如果当前不存在事务,则新建一个事务;`updateUserNameWithNewTransaction` 方法使用 `REQUIRES_NEW` 传播行为,无论当前是否存在事务,都会新建一个事务;`updateUserNameWithNestedTransaction` 方法使用 `NESTED` 传播行为,如果当前存在事务,则在嵌套事务中执行。
阅读全文