Spring Transactional没有回滚

时间:2016-08-05 09:54:35

标签: java spring spring-transactions transactional

 @Transactional
 public void setSomething(String name) { ... }

很抱歉问这个非常基本的问题,Spring事务注释是如此强大但却难以理解。基于上面的代码,我没有rollbackFor控件,这意味着,如果存在异常,则此事务上下文将不会回滚。但根据我以旧方式覆盖事务块的经验,如果没有异常回滚,将跳过commit并导致(Oracle)数据库表被锁定(暂停,其他用户可以&# 39;提交他们的SQL)。如果不使用rollbackFor,Spring会有同样的问题吗?

2 个答案:

答案 0 :(得分:7)

默认/ @ Transactional设置为:

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

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

但通常仅仅通过@Transactional注释告诉您的类是不够的,将@EnableTransactionManagement添加到您的配置中。

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

<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

希望有所帮助。

答案 1 :(得分:5)

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

事务已提交或回滚,@Transactional方法无法导致未终止的事务(至少在正常操作中)。