gpt4 book ai didi

java - Spring事务抛出异常后不回滚

转载 作者:行者123 更新时间:2023-12-05 05:37:42 25 4
gpt4 key购买 nike

我有一个带有方法的服务,它没有用 @Transactional 注释:

@Service
@RequiredArgsConstructor
public class MainService {

private final ServiceA serviceA;

public void processData() {
List<EntityA> list = serviceA.getList();
list.forEach(item -> {
try {
serviceA.doSomeDbOperations(item);
} catch(Exception e) {
// some processing here
} finally {
// some processing and DB interactions here
}
})
}

}

目标是在抛出异常时回滚 try block (serviceA.doSomeDbOperations(item)) 中发生的更改。所以我在 ServiceA 中用 @Transactional 注释了这个方法:

@Service
public class ServiceA {
// dependencies

@Transactional
public void doSomeDbOperations(EntityA item) {
// some logic here
repositoryA.save(item)
serviceB.deleteSomething(input)
}
}

serviceB.deleteSomething(input) 可能抛出异常:

@Service
public class ServiceB {
// dependencies

public void deleteSomething(EntityA item) {
// some logic here
if(condition) {
Throw new RuntimeException();
}
}
}

问题是抛出Exception时,try block 中的变化没有回滚,数据不一致。知道问题出在哪里吗?

最佳答案

我猜您在 ServiceB 中使用的是已检查的异常。在 Spring 中,默认情况下事务仅在未经检查的异常上回滚,因此请尝试在 ServiceB.deleteSomething() 方法中抛出一个 RuntimeException。

如果你在那里需要检查异常,你可以在你的 ServiceA.doSomeDbOperations() 方法中做这样的事情:

@Transactional(rollbackFor = Throwable.class)

一些引用资料:

https://www.baeldung.com/java-checked-unchecked-exceptions

How to make Spring @Transactional roll back on all uncaught exceptions?

关于java - Spring事务抛出异常后不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73077272/

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