Spring transaction propagation_required问题

时间:2012-05-20 15:27:59

标签: spring hibernate spring-transactions

在我们的java项目中,我们正在使用带有hibernate和spring的ORM。 我在删除持久对象时遇到了问题。例如,此示例方法按ID获取实体,然后将其删除:

@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-Final,spring.version 3.0.5.RELEASE

1 个答案:

答案 0 :(得分:2)

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

检查你的日志以查看导致事务回滚的原因,请注意即使像NoResultException这样的简单SELECT -query失败也会导致事务回滚,除非你在{{1 - 注释它不会回滚某些例外。