Spring Transactional没有回滚

GMs*_*soF 1 java spring transactional spring-transactions

 @Transactional
 public void setSomething(String name) { ... }
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ego 7

默认的/ @ Transactional设置是:

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

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

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

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

<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" rollback-for="NoProductInStockException"/>
<tx:method name="*"/>
</tx:attributes>
Run Code Online (Sandbox Code Playgroud)

或者带注释

@Transactional(rollbackFor=NoProductInStockException.class)
Run Code Online (Sandbox Code Playgroud)

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

希望有所帮助.


Kay*_*man 5

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

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