spring事务 的传播行为PROPAGATION_NESTED:,及其代码示例
时间: 2023-07-19 08:05:36 浏览: 153
PROPAGATION_NESTED 表示在当前事务中创建一个嵌套的事务,如果存在当前事务,则当前事务作为主事务,新的嵌套事务作为子事务,子事务可以独立提交或回滚,但是主事务提交时会提交所有的子事务,主事务回滚时会回滚所有的子事务。
以下是使用 PROPAGATION_NESTED 的代码示例:
```java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Transactional(propagation = Propagation.REQUIRED)
public void updateUser(User user) {
userDao.update(user);
try {
// 在当前事务中创建一个嵌套的事务
addScore(user.getId(), 10);
} catch (Exception e) {
e.printStackTrace();
}
}
@Transactional(propagation = Propagation.NESTED)
public void addScore(Long userId, int score) {
userDao.addScore(userId, score);
if (score == 10) {
throw new RuntimeException("score is 10, rollback...");
}
}
}
```
在 updateUser 方法中,使用 PROPAGATION_REQUIRED 开启一个事务,同时调用了 addScore 方法,在 addScore 方法中使用 PROPAGATION_NESTED 开启一个嵌套的事务。当 addScore 方法中抛出异常时,只会回滚嵌套事务,不会影响主事务。当 updateUser 方法中抛出异常时,会回滚主事务,同时也会回滚嵌套事务。
阅读全文