【发布时间】:2020-10-30 14:33:59
【问题描述】:
我有以下应用程序设置:
@SpringBootApplication
@EnableTransactionManagement
public class MyApp extends SpringBootServletInitializer {
...
}
使用具有以下内容的类:
public class DoStaff {
public void doStaffOnAll(List<MyObject> myObjects) {
for (int i=0; i<myObjects.size(); i++) {
try {
doStaffOnSingle(myObjects.get(i), i);
} catch (Exception e) {
e.printStrackTrace();
}
}
}
@Transactional
public void doStaffOnSingle(MyObject myObject, int i) {
repository.save(myObject);
if (i%2==0) {
throw new RuntimeException();
}
}
}
因此,如果我使用 MyObjects 列表调用 DoStaff.doStaffOnAll,代码会保存列表中的所有元素,但还会为每个第二个元素引发运行时异常。
由于doStaffOnSingle 有@Transactional 注释,我希望每隔一个元素都会回滚。
但是如果我运行这段代码,每个元素都会成功保存在数据库中。这是为什么?我做错了什么?
【问题讨论】:
-
@Transactional不适用于类内部的方法调用,仅当从外部调用@Transactional方法时才适用。将doStaffOnAll()移动到不同的 Spring 组件,它就可以工作了。
标签: java spring-boot exception transactions rollback