Spring 事务性无回滚

问题描述 投票:0回答:2
 @Transactional
 public void setSomething(String name) { ... }

很抱歉问这个非常基本的问题,Spring

@Transactional
注解是如此强大,但又超级难理解。

基于上面的代码,我没有

rollbackFor
控制,这意味着,如果出现异常,这个transactional上下文将不会回滚。但根据我用旧方法覆盖事务块的经验,如果没有异常回滚,
commit
将被跳过并导致(Oracle)数据库的表被锁定(挂起,其他用户无法提交他们的SQL)。

不使用

rollbackFor
Spring也会有同样的问题吗?

java spring transactions spring-transactions
2个回答
8
投票

默认的/@事务设置是:

  • 需要进行传播设置。
  • 隔离级别为默认。
  • 事务是读/写的。
  • 交易超时默认为底层默认超时
  • 交易系统,如果不支持超时则没有。
  • 任何RuntimeException都会触发回滚,任何checked Exception都会触发回滚 没有。

因此,在您的情况下,如果出现 RuntimeException,这将被回滚。

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

您可以准确配置哪些异常类型将事务标记为回滚,包括已检查的异常。以下 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

希望有帮助。


6
投票

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

事务要么提交,要么回滚,

@Transactional
方法不可能导致事务未终止(至少在正常操作中)。

© www.soinside.com 2019 - 2024. All rights reserved.