首页 > 解决方案 > Spring Batch - 处理器步骤期间的事务性 REQUIRES_NEW

问题描述

我在批处理块处理的处理器步骤期间使用 @Transactional(propagation = Propagation.REQUIRES_NEW) 时遇到问题。

我试图实现的是在处理器步骤中保留自定义数据:

public class AbstractImportRecordProcessor implements InitializingBean, ImportContextAware,
    ItemProcessor<ImportRecord, BatchReportBasket> {

@Autowired
private TransactionBasketService transactionBasketService;

@Override
public final BatchReportBasket process(final ImportRecord item) {

...
transactionBasketService.save(transactionBasket);
...
}
}

和服务实现:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void save(final TransactionBasket transactionBasket) {
}

如果我不添加@Transactional,则由于回滚,数据不会保留在异常中。

如果我使用@Transactional,则基本处理的异常处理似乎被破坏了。如果发生异常,则不会像以前那样处理。

所以不知何故,@Transactional 对块事务处理和异常处理有影响。从我的角度来看,这不应该发生。

任何想法为什么会发生这种情况?


编辑:关于我们为什么需要这个的更多信息

我们处理进口记录并将其发送给作者。在我们的流程中,我们每天都会获得 90% 的相同“数据”。因此,我们需要保存上次运行期间已经处理过的数据。如果我们在处理器中知道我们已经处理了数据,我们可以跳过它而不将它发送给作者。为此,我们要将数据的主键保存到专用的数据库表中。无论编写器中是否有任何异常,此信息都应该是持久的。

如果我们把它放到一个监听器中,我们已经完成了处理并且不能做这样的事情。


提前感谢您的意见。

标签: javaspringspring-batchspring-transactions

解决方案


推荐阅读