【发布时间】:2020-04-02 12:40:37
【问题描述】:
我确定我错过了什么,但我不知道到底是什么......
给出以下 sn-p:
@Service
public class MyClass {
private MyClass self;
private UserRepository userRepository;
private ApplicationContext applicationContext;
@PostConstruct
private void init() {
self = applicationContext.getBean(MyClass.class);
}
@Transactional
public void doA(User user) {
...
if (condition) {
self.doB(user);
throw new SecurityException();
}
user.setRandomField("x");
userRepository.save(user);
}
@Transactional(value = Transactional.TxType.REQUIRES_NEW)
public void doB(User user) {
...
userRepository.save(user);
}
}
我对@987654322@的了解是,如果使用它,调用repository.save(entity)是多余的。
我正在尝试做的是从事务方法处理实体,如果存在中断条件,则调用一个新方法(使用REQUIRES_NEW 注释),该方法将更新实体的某些字段并保存它.然后根方法 (doA) 会引发异常。仅供参考:@Transactional(dontRollbackOn = SecurityException.class) 在这种情况下不是一个选项。
为了使用这种提交机制,我只是将当前 bean 注入一个名为 self 的变量中,而不是仅使用一种方法创建新 bean,因此我可以使用 bean 代理进行事务管理。
奇怪的是,如果我从doB 中删除save 调用,当doA 事务因为SecurityException 而回滚时,doB 执行的更改也会回滚。但如果我让它进去,它就会按预期工作。
我做错了什么还是错过了什么?
谢谢!
【问题讨论】:
-
尽量不要在 doB() 中传递 User 实例。而是传递一个 Id 并在内部从 repo 中读取用户。我不确定在不同会话之间如何处理附加的实体。
-
您可以发表您的评论作为答案,以便我接受吗? :) 多谢,伙计!就是这样!
-
不客气!
标签: java spring hibernate spring-transactions transaction-isolation