我正在尝试创建一个事务方法,该方法调用其他几种事务方法,以便保存一些相互依赖的数据库实体。如果任何调用失败,我希望事务完全回滚。但是,这不是观察到的行为。这是我的代码:
@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public void save(EntityToBeSaved entity) {
try{
for(SubEntity sub: entity.getSubEntities()) //specifics omitted
saveSubEntity(sub); //this is transactional
}
catch (DataIntegrityViolationException e){
throw new BusinessException("Duplicate Name");
}
}
saveSubEntity
也有Propagation.REQUIRED
和rollobackFor = Throwable.class
,但当第二次saveSubEntity
来电时交易失败时,第一个subEntity
会被提交。
答案 0 :(得分:0)
问题可能是Hibernate无法为保存方法打开一个事务。
假设如果Hibernate没有为 save 方法创建任何事务,那么每个 saveSubEntity 调用都会因其Propagation.REQUIRED而处于不同的事务中。因此,每个 saveSubEntity 调用的更改都将提交给数据库。
要检查是否为保存方法创建了交易,您是否可以帮我删除 saveSubEnitty 方法上的 Tranactional 注释。如果没有为保存方法创建任何事务,您将看到错误。
答案 1 :(得分:0)
显然,该问题是由于Spring注入错误而产生的,因为该服务未在启动时实例化,导致注释无法正常工作。谢谢你的帮助。