[英]Spring Batch Rollback full Step instead of current transaction in chunk orientation
我想從文件中讀取項目並將其插入到表中。 為此,我使用FlatFileItemReader
和JdbcBatchItemWriter
。 我在步驟中使用了 Chunk Orientation。 所以我的步驟看起來像這樣。
private Step createPoliciesStep() {
return stepBuilderFactory.get("CreatePoliciesStep")
.<PolicyDTO, PolicyDTO>chunk(2)
.reader(createPoliciesReaderFunc())
.writer(createPoliciesWriterFunc())
.listener(createPoliciesWriteListener)
.listener(createPoliciesStepListener)
.build();
}
我給的提交間隔是 2。所以每 2 條記錄提交就會發生。 例如,在讀取第 4 條記錄時拋出一些異常。 當時沒有插入第 3 條和第 4 條記錄,那絕對沒問題。 我想回滾我表上的第一條和第二條記錄(在以前的事務中提交)。
我期待的是在
Begin
交易之前。 步驟之后應commit
事務。 在任何異常之間應該回滾整個步驟。
我們有一個簡單的方法,萬一我的下一步失敗了,我可以刪除那些條目。 但我覺得這不是一個好方法。
我嘗試通過添加DataSourceTransactionManager
的事務管理器和事務屬性但沒有工作。 添加我的步驟后看起來像這樣
@Bean
PlatformTransactionManager policyTransactionManager(@Qualifier("mysqlDataSource")DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
private Step createPoliciesStep() {
log.info("Create Policies Step Initiated ");
DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
attribute.setPropagationBehavior(Propagation.REQUIRED.value());
attribute.setIsolationLevel(Isolation.DEFAULT.value());
return stepBuilderFactory.get("CreatePoliciesStep")
.transactionManager(policyTransactionManager)
.<PolicyDTO, PolicyDTO>chunk(2)
.reader(createPoliciesReaderFunc())
.writer(createPoliciesWriterFunc())
.listener(createPoliciesWriteListener)
.transactionAttribute(attribute)
.listener(createPoliciesStepListener)
.build();
}
任何人都可以建議一些好的方法來回滾整個步驟。 提前致謝!!!!
Spring 批處理中的事務邊界是圍繞塊而不是步驟定義的。 所以不可能為整個步驟配置一個事務。
您的用例的一個常見模式是添加一個單獨的步驟,該步驟基於上一步的退出狀態(成功或失敗)執行“補償操作”,即回滾您案例中上一步的更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.