gpt4 book ai didi

java - 调试 Java Spring 中的事务注释

转载 作者:行者123 更新时间:2023-12-02 09:33:59 25 4
gpt4 key购买 nike

更新现有代码段,如下所示:

@Override
@Transactional
public void update(SomeObject someObj) throws BusinessServiceException {
...
someObjectRepository1.update(someObj);
someObjectRepository2.create(someObj);

//New code below:
someObjectRelatedService.doStuff(someObj); // <--new code
//Throws error, object does not exist in someObjectRepository2
}

这里的问题是 someObjectRelatedService.doStuff 需要 someObjectRepository2 的最新版本 - 但事务注释防止这种情况发生,它会在方法完全运行后更新存储库。我能够通过使用调试器并在其间运行数据库调用来进行验证。

处理这种情况的最佳方法是什么?仅仅是为了将 someObjectRelatedService 调用提取到事务方法之外吗?

最佳答案

本质上,您需要移动交易的边界。虽然手动刷新事务是一种选择,但我不建议这样做。

最简单的修复,如果 SomeObjectRepository2#create(...) 的语义允许的话,就是用 @Transactional(isolation = Propagation.REQUIRES_NEW) 注释这个方法。 .

如果这不可能,我建议进行以下小的重新设计。首先,我们使用一个方法创建一个新类,该类应该执行与所需数据相关的代码:

@Component
public class NewClass {
final SomeObjectRepository2 someObjectRepository2;

@Autowired
public NewClass(final SomeObjectRepository2 someObjectRepository2) {
this.someObjectRepository2 = someObjectRepository2;
}

@Transactional(isolation = Propagation.REQUIRES_NEW) // enforces new transaction
public WhateverNeedsToBereturned newMethod(WhateverType someObject) {
return someObjectRepository2.create(someObj);
}
}

然后我们重写现有代码以使用新类:

@Override
@Transactional
public void update(SomeObject someObj) throws BusinessServiceException {
...
someObjectRepository1.update(someObj);
newClassInstance.newMethod(someObj);

//New code below:
someObjectRelatedService.doStuff(someObj);
//Throws error, object does not exist in someObjectRepository2
}

请注意,您必须创建一个新类才能使其工作。通过 this 调用方法-引用不被代理,因此 @Transactional注解不生效。

进一步注意newClassInstance出于同样的原因,必须通过 DI 容器注入(inject)。

关于java - 调试 Java Spring 中的事务注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57699264/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com