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对于您的系统而言就像某种类型的逻辑错误一样。