【问题标题】:Spring transaction propagation_required issueSpring事务传播_必需问题
【发布时间】:2012-05-27 07:58:56
【问题描述】:

在我们的 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);
}

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

在方法定义@Transactional(propagation = Propagation.REQUIRES_NEW)添加如下注解即可解决问题。

谁能解释为什么它不适用于默认传播类型 PROPAGATION_REQUIRED。

提前致谢。

环境详情:

hibernate.version 3.5.5-Final,spring.version 3.0.5.RELEASE

【问题讨论】:

  • 周边事务可能有问题。如果您使用 PROPAGATION_REQUIRED,则此方法使用当前事务。如果在运行此方法后当前事务期间出现异常,则可能会回滚更改。

标签: spring hibernate spring-transactions


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 2017-11-22
    • 2014-06-22
    • 2018-01-15
    • 2016-02-14
    • 2011-09-20
    • 2014-08-14
    • 1970-01-01
    相关资源
    最近更新 更多