@Transactional
public void setSomething(String name) { ... }
很抱歉问这个非常基本的问题,Spring
@Transactional
注解是如此强大,但又超级难理解。
基于上面的代码,我没有
rollbackFor
控制,这意味着,如果出现异常,这个transactional上下文将不会回滚。但根据我用旧方法覆盖事务块的经验,如果没有异常回滚,commit
将被跳过并导致(Oracle)数据库的表被锁定(挂起,其他用户无法提交他们的SQL)。
不使用
rollbackFor
Spring也会有同样的问题吗?
默认的/@事务设置是:
因此,在您的情况下,如果出现 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
希望有帮助。
rollbackFor
及相关参数用于微调。如果省略它们,默认行为是回滚 RuntimeExceptions
。其他异常不会执行回滚,并且对数据库所做的任何更改都将被提交。
事务要么提交,要么回滚,
@Transactional
方法不可能导致事务未终止(至少在正常操作中)。