【发布时间】:2020-03-11 08:36:09
【问题描述】:
我在 Spring Boot 中配置了一个项目注解。 pom 有依赖 spring-data-jpa 和 spring-tx。
与 Config 类或属性中的事务配置无关(因为理论上不需要)。
鉴于这项服务:
package com.appserver.motion.service;
@Component(value = "exerciseService")
@Service
@Data
public class ExerciseService {
@Autowired private ExerciseRepository exerciseRepository;
@Autowired private TagRepository tagRepository;
@Autowired private ExerciseTagJoinRepository exerciseTagJoinRepository;
@Autowired private EquipmentRepository equipmentRepository;
@Autowired private ExerciseEquipmentJoinRepository exerciseEquipmentJoinRepository;
private ExerciseCommand exerciseCommand = new ExerciseCommand();
private List<SelectItem> tags = new ArrayList<SelectItem>();
private List<Integer> selectedTags = new ArrayList<Integer>();
private List<SelectItem> equipments = new ArrayList<SelectItem>();
private List<Integer> selectedEquipments = new ArrayList<Integer>();
@Transactional
public int saveExercise() {
try {
int resultat = exerciseRepository.save(toEntity()).getExe_id();
if (this.selectedTags!=null) {
for (Integer selectedTag: this.selectedTags) {
ExerciseTagJoinEntity etje = new ExerciseTagJoinEntity();
etje.setExa_exe_id(new Integer(resultat));
etje.setExa_tag_id(new Integer(selectedTag));
exerciseTagJoinRepository.save(etje);
}
}
if (this.selectedEquipments!=null) {
for (Integer selectedEqu: this.selectedEquipments) {
ExerciseEquipmentJoinEntity eeje = new ExerciseEquipmentJoinEntity();
eeje.setEeq_exe_id(new Integer(resultat));
eeje.setEeq_equ_id(new Integer(selectedEqu));
exerciseEquipmentJoinRepository.save(eeje);
}
}
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Info:", "Insertat correcte");
FacesContext.getCurrentInstance().addMessage("Correcte:", facesMsg);
return resultat;
}catch (Exception ex) {
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error:", ex.getMessage());
FacesContext.getCurrentInstance().addMessage("Error:", facesMsg);
return -1;
}
}
}
存储库都是 JpaRepository 的扩展,并带有 @Repository 注释。
问题在于事务不会在异常时回滚,无论是否带有 rollBackFor 属性。
另一方面,事务似乎正在工作,因为直到保存方法结束,插入才在 DB 中刷新。
顺便说一下,我正在使用 PostgreSQL DB。
我错过了什么吗?
我一直在记录交易包,这就是我得到的:
2019-11-15 08:52:45.493 TRACE 9100 --- [nio-3000-exec-4] o.s.t.i.TransactionInterceptor :获取 [com.appserver.motion.service.ExerciseService.saveExercise] 的交易 2019-11-15 08:52:47.678 TRACE 9100 --- [nio-3000-exec-4] o.s.t.i.TransactionInterceptor :获取 [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save] 的交易 2019-11-15 08:52:48.015 TRACE 9100 --- [nio-3000-exec-4] o.s.t.i.TransactionInterceptor :为 [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save] 完成交易 2019-11-15 08:52:49.163 TRACE 9100 --- [nio-3000-exec-4] o.s.t.i.TransactionInterceptor:获取 [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save] 的交易 2019-11-15 08:52:49.168 TRACE 9100 --- [nio-3000-exec-4] o.s.t.i.TransactionInterceptor :为 [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save] 完成交易 2019-11-15 08:52:49.168 TRACE 9100 --- [nio-3000-exec-4] o.s.t.i.TransactionInterceptor:获取 [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save] 的交易 2019-11-15 08:52:49.171 TRACE 9100 --- [nio-3000-exec-4] o.s.t.i.TransactionInterceptor :为 [org.springframework.data.jpa.repository.support.SimpleJpaRepository.save] 完成交易 2019-11-15 08:53:02.439 TRACE 9100 --- [nio-3000-exec-4] o.s.t.i.TransactionInterceptor :为 [com.appserver.motion.service.ExerciseService.saveExercise] 完成交易
【问题讨论】:
标签: spring-boot jpa transactions spring-data-jpa spring-transactions