Spring 没有回滚的事务
Spring Transactional without rollback
@Transactional
public void setSomething(String name) { ... }
很抱歉问这个非常基本的问题,Spring 事务注释非常强大,但也很难理解。根据上面的代码,我没有 rollbackFor
控制,也就是说,如果有异常,这个事务上下文不会回滚。但是根据我用旧方法覆盖事务块的经验,如果没有异常回滚,commit
将被跳过并导致(Oracle)数据库的table被锁定(挂起,其他用户不能'不要提交他们的 SQL)。如果不使用 rollbackFor
,Spring 会出现同样的问题吗?
rollbackFor
及相关参数用于微调。如果省略它们,默认行为是回滚 RuntimeExceptions
。其他异常不执行回滚,对数据库所做的任何更改都将被提交。
事务已提交或回滚,@Transactional
方法不可能导致事务未终止(至少在正常操作中)。
默认的 /@Transactional 设置是:
- 传播设置是必需的。
- 隔离级别为默认。
- 交易是 read/write。
- 交易超时默认为底层的默认超时
- 事务系统,或者 none 如果不支持超时。
- 任何 RuntimeException 触发回滚,以及任何检查异常
没有。
所以在你的情况下,如果你有一个 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
希望对您有所帮助。
@Transactional
public void setSomething(String name) { ... }
很抱歉问这个非常基本的问题,Spring 事务注释非常强大,但也很难理解。根据上面的代码,我没有 rollbackFor
控制,也就是说,如果有异常,这个事务上下文不会回滚。但是根据我用旧方法覆盖事务块的经验,如果没有异常回滚,commit
将被跳过并导致(Oracle)数据库的table被锁定(挂起,其他用户不能'不要提交他们的 SQL)。如果不使用 rollbackFor
,Spring 会出现同样的问题吗?
rollbackFor
及相关参数用于微调。如果省略它们,默认行为是回滚 RuntimeExceptions
。其他异常不执行回滚,对数据库所做的任何更改都将被提交。
事务已提交或回滚,@Transactional
方法不可能导致事务未终止(至少在正常操作中)。
默认的 /@Transactional 设置是:
- 传播设置是必需的。
- 隔离级别为默认。
- 交易是 read/write。
- 交易超时默认为底层的默认超时
- 事务系统,或者 none 如果不支持超时。
- 任何 RuntimeException 触发回滚,以及任何检查异常 没有。
所以在你的情况下,如果你有一个 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
希望对您有所帮助。