【发布时间】:2022-07-22 16:30:27
【问题描述】:
我有一个带有方法的服务,它没有用@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 块 (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 Exception();
}
}
}
问题是当抛出异常时,try 块中的更改并没有回滚,数据不一致。知道问题出在哪里吗?
【问题讨论】:
-
能否确认一下ServiceA和ServiceB也被@Service注解了?
-
Rolling back a declarative transaction: "从事务方法抛出的检查异常在默认配置中不会导致回滚"
-
@cdr89 是的。我更新了问题。
标签: java spring-boot hibernate spring-data spring-transactions