propagation_nested
时间: 2023-06-05 18:47:52 浏览: 158
propagation_nested是指在嵌套事务中,事务的传播行为。在嵌套事务中,内部事务可以独立提交或回滚,而外部事务则需要等待内部事务的完成才能提交或回滚。propagation_nested的传播行为就是指内部事务的提交或回滚对外部事务的影响。如果内部事务提交,但外部事务回滚,则内部事务的提交也会被回滚。如果内部事务回滚,但外部事务提交,则内部事务的回滚会被忽略。
相关问题
PROPAGATION_NESTED
PROPAGATION_NESTED是事务传播行为中的一种选项。在Spring框架中,事务是用来管理数据库操作的一种机制,可以确保一组数据库操作要么全部成功提交,要么全部回滚。事务传播行为定义了事务在不同方法之间如何传播和管理。
PROPAGATION_NESTED表示在一个已存在的事务中创建一个嵌套的事务。嵌套事务是独立于外部事务的子事务,它可以独立地进行提交或回滚。如果嵌套事务成功提交,则对外部事务没有影响;如果嵌套事务回滚,则会回滚到嵌套点,并且外部事务也会回滚。
嵌套事务的特点是可以在内部事务中进行独立的提交和回滚操作,而不会影响到外部事务的状态。嵌套事务可以用于处理一些特殊的业务需求,例如在某个方法中需要独立地进行数据库操作,并且希望这些操作要么全部成功提交,要么全部回滚。
spring事务 的传播行为PROPAGATION_NESTED:,及其代码示例
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 方法中抛出异常时,会回滚主事务,同时也会回滚嵌套事务。
阅读全文