【问题标题】:Proper Hibernate nested transactions handling正确的 Hibernate 嵌套事务处理
【发布时间】: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);
    }
}

我对@9​​87654322@的了解是,如果使用它,调用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


【解决方案1】:

尽量不要在 doB() 中传递 User 实例。 而是传递一个 Id 并在内部从 repo 中读取用户。我不确定在不同会话之间如何处理附加的实体。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-02
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多