mps*_*tos 1 java spring jpa spring-data-jpa kotlin
我在 Spring JPA 数据和嵌套事务方面遇到问题。以下是我的服务的嵌套事务的两种方法。
@Service
public UserService {
@Transactional
public User createUser(UserDto userDto) {
....
user = saveUser(user);
sendEmail(user);
....
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public User saveUser(User user) {
return userRepository.save(user);
}
Run Code Online (Sandbox Code Playgroud)
碰巧有一种情况,方法 userRepository.save() 应该抛出异常,但不知何故没有被抛出,看起来它正在等待父事务完成。我预计 saveUser 方法会抛出异常,而 sendEmail 方法甚至不会被执行。
因为该方法UserService.saveUser
将传播设置为Propagation.REQUIRES_NEW
我期望提交事务(要执行的 SQL 语句)并且传播任何异常。
我没有设置任何与事务相关的内容,所以我相信刷新模式设置为自动。
谁能发现我做错了什么或者我的误解是什么?
这是因为您是@Transactional
从同一个 bean 中调用方法。
@Transactional
仅适用于由 spring 创建的代理上调用的方法。这意味着,当您创建 @Service 或其他 bean 时,从外部调用的方法将是事务性的。如果从 bean 内部调用,则不会发生任何事情,因为它不通过代理对象。
最简单的解决方案是将方法移动到另一个 @Service 或 bean。如果你真的想将它保留在同一个组件中,那么你需要调用它,以便它被 Spring AOP 包装在代理中。你可以这样做:
private YourClass self;
@Autowired
private ApplicationContext applicationContext;
@PostConstruct
public void postContruct(){
self = applicationContext.getBean(YourClass.class);
}
Run Code Online (Sandbox Code Playgroud)
然后调用方法 onself
将导致打开一个事务。
换句话说:您没有遇到任何异常情况,因为@Transactional
超过saveUser
不起作用。
归档时间: |
|
查看次数: |
3154 次 |
最近记录: |