2012-05-20 40 views
3

在我们的java项目中,我们使用了带有hibernate和spring的ORM。 我在删除持久对象时遇到了问题。例如,这样的方法通过IDS得到实体,然后将其删除:Spring transaction propagation_required issue

@Transactional 
public void remove(List<Long> ids) { 
    SearchTemplate template = new SearchTemplate(); 
    template.addParameter("milestoneId",ids); 
    List <InvoiceQueue> items = this.findByCriteria(template); 
    ... 
    this.delete(items); 
} 

方法执行好,没有任何异常,但实际上并没有删除数据库中的项目。

将以下注释添加到方法定义@Transactional(propagation = Propagation.REQUIRES_NEW)可解决问题。

任何人都可以解释为什么它不适用于默认传播类型PROPAGATION_REQUIRED。

在此先感谢。

环境的详细信息:

hibernate.version 3.5.5决赛,spring.version 3.0.5.RELEASE

+6

周围的交易可能有问题。如果您使用PROPAGATION_REQUIRED,则此方法使用当前事务。如果在运行此方法后当前事务中存在异常,则可能会回滚这些更改。 –

回答

2

真的只是随声@PeterBagyinszki在他的评论中说,但原因很可能是,发生删除的事务由于其他部分抛出异常而回滚,并且在事务处理期间所做的所有更改都被取消。使用Propagation.REQUIRES_NEW,删除在其自己的单独嵌套事务中完成。嵌套事务(提交或回滚)的结果不会影响“外部”事务,反之亦然。

请检查您的日志以查看导致事务回滚的原因,请注意,即使类似简单的SELECT查询失败,会导致事务回滚,除非您在@Transactional中明确声明 - 注释它不回滚某些例外情况。

相关问题