【问题标题】:Spring Transactional without rollback没有回滚的 Spring Transactional
【发布时间】:2016-12-11 16:49:26
【问题描述】:
 @Transactional
 public void setSomething(String name) { ... }

很抱歉问了这个非常基本的问题,Spring 事务注解非常强大但又超级难以理解。根据上面的代码,我没有rollbackFor控制,意思是如果有异常,这个事务上下文不会回滚。但是根据我在覆盖事务块的旧方法中的经验,如果没有异常回滚,commit 将被跳过并导致(Oracle)数据库的表被锁定(挂起,其他用户无法提交他们的 SQL)。如果不使用rollbackFor,Spring 会出现同样的问题吗?

【问题讨论】:

    标签: java spring spring-transactions transactional


    【解决方案1】:

    rollbackFor 及相关参数用于微调。如果省略它们,默认行为是回滚 RuntimeExceptions。其他异常不执行回滚,对数据库所做的任何更改都将被提交。

    事务要么提交要么回滚,@Transactional 方法不会导致事务未终止(至少在正常操作中)。

    【讨论】:

      【解决方案2】:

      默认的 /@Transactional 设置是:

      • 传播设置是必需的。
      • 隔离级别为默认。
      • 事务是读/写的。
      • 交易超时默认为底层默认超时
      • 事务系统,如果不支持超时则无。
      • 任何 RuntimeException 都会触发回滚,以及任何已检查的异常 没有。

      所以在你的情况下,如果你有一个 RuntimeException,这将被回滚。

      但通常只告诉您使用@Transactional 注释来注释您的类是不够的,请将@EnableTransactionManagement 添加到您的配置中。

      您可以准确配置哪些异常类型将事务标记为回滚,包括检查的异常。以下 XML sn-p 演示了如何为已检查的、特定于应用程序的异常类型配置回滚。

      <tx:advice id="txAdvice" transaction-manager="txManager">
      <tx:attributes>
      <tx:method name="get*" read-only="true" rollback-for="NoProductInStockException"/>
      <tx:method name="*"/>
      </tx:attributes>
      

      或带注释

      @Transactional(rollbackFor=NoProductInStockException.class)
      

      您可以在这里找到详细的文档: http://docs.spring.io/autorepo/docs/spring/4.2.x/spring-framework-reference/html/transaction.html

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-05
        • 2017-04-14
        • 2020-06-12
        • 2018-11-08
        • 2019-06-30
        • 2016-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多