【问题标题】:Managing rollback on transaction管理事务回滚
【发布时间】:2011-02-24 16:49:17
【问题描述】:

注释@Transactional 有问题。

我有一个方法可以做一些事情,在里面我抛出并捕获一个IllegalArgumentException

我认为(即使我已经捕获了异常)它将事务设置为 rollbackOnly(在抛出异常时会触发一些触发器)并且它在没有成功提交事务的情况下结束。

这是错误:

org.springframework.transaction.TransactionSystemException : Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly

我可以在 @Transactional 上添加一个 no-rollback-for 我抛出和捕获的异常,但我不认为这是一个真正的解决方案。

也许有一种方法可以取消设置事务上的 rollbackOnly,但我认为这也不是最佳做法......

那么,你知道我该怎么做吗?

谢谢,

【问题讨论】:

    标签: java hibernate spring jpa


    【解决方案1】:
    1. Try / catch with IllegalArgumentException 听起来像是代码异味(有效的 Java 项目 57:Use Exceptions only for exceptional conditions

    2. 事务是否设置为rollbackOnly 取决于使用的代理机制。如果您使用 JDK 代理,则处理程序位于外部,无法在方法调用中注册捕获的异常。如果您使用mode=aspectj,情况会有所不同。此外,如果您有嵌套的事务上下文,则必须在内部方法上使用 @Transactional(noRollbackFor=IllegalArgumentException.class)

    【讨论】:

    • 感谢您的回答。 (我只能阅读您提供的链接的一部分),而且我真的不明白您是在谈论一般情况下不使用异常,还是不使用运行时异常。注意:(我使用异常来警告从某些类向其他类抛出的错误)
    • @RoD 你应该阅读 Effective Java 这本书,它是每个 Java 开发人员都应该阅读的一本书。但要了解这个具体方面,可以阅读本次搜索返回的任何文章:exceptions "flow control"
    【解决方案2】:

    如果您无法提交事务,那么您的代码中可能存在异常。通过尝试/捕获,您隐藏了完整的异常,并简单地获得了一个微妙的通用解释。你也会得到一个回滚。

    为了理解您的错误并获得对错误的完整描述,请尝试删除 try/catch 并让代码爆炸。在那里您将看到问题的真正根源。

    【讨论】:

      猜你喜欢
      • 2011-12-10
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 2012-08-20
      相关资源
      最近更新 更多