Spring事务:在Exception或Throwable上回滚

我想知道用它代替是否有意义

@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) 

使用Throwable

 @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) 

据我所知,捕捉Error将帮助我们正确行事,即使发生了非常糟糕的事情。 或者也许没有用?

据我所知,捕捉错误将帮助我们正确行事,即使发生了非常糟糕的事情。 或者也许没有用?

您不需要显式指定rollbackFor = Throwable.class ,因为如果发生Error ,spring将默认回滚事务。

请参见12.5.3回滚声明性事务

在其默认配置中,Spring Framework的事务基础结构代码仅在运行时未经检查的exception情况下标记用于回滚的事务; 也就是说,抛出的exception是RuntimeException的实例或子类。 (错误也将 – 默认情况下 – 导致回滚) 。 从事务方法抛出的已检查exception不会导致在默认配置中回滚。

或者看一下DefaultTransactionAttribute

 public boolean rollbackOn(Throwable ex) { return (ex instanceof RuntimeException || ex instanceof Error); } 

由于您使用的是@Transactional ,我们可以放心地假设您正在通过Spring,Hibernate或其他JDBC包装器执行数据库操作。 这些JDBC包装器通常不会抛出已检查的exception,它们会抛出包含JDBC SQLException类型的运行时exception。

默认情况下,仅当抛出未经检查的exception时,@ @Transactional才会设置为回滚。

考虑一个像这样的用例

 @Transactional public void persistAndWrite(Bean someBean) throws IOException{ getSession().save(someBean); // DB operation someFileService.writeToFile(someBean); File IO operation which throws IOException } 

您不一定要回滚数据库操作只是因为我们无法向文件写入内容。

同样

 @Transactional public void persistAndThrowOutOfMemory(Bean someBean) { getSession().save(someBean); // DB operation someService.hugeOperationThrowsOutOfMemoryError(); // consumes all memory, throws OutOfMemoryError } 

您不一定要回滚已保存的实体,因为某些服务会导致消耗太多内存。

@Transactional为您提供选项。 在适当的地方使用它。

我不知道是否可能但是处理像Error s这样的Throwable是一种糟糕的编程风格,开发人员不负责处理这种致命的错误。 总会发生你无法处理的坏事。 您应该在必要时处理已检查的exception,这些exception对于您的系统而言就像某种类型的逻辑错误一样。