【问题标题】:Controlling commit/rollback in spring batch using JdbcBatchItemWriter使用 JdbcBatchItemWriter 控制春季批处理中的提交/回滚
【发布时间】:2015-06-14 14:16:33
【问题描述】:

我正在使用 Spring Batch 读取数据表单数据库并将其写入文件。
以下是所涉及的步骤:
1.从数据库中读取数据
2. 将数据写入文件
3. 如果文件写入成功,则更新数据库行。

根据 Spring Batch 文档和其他来源,我可以使用 JdbcBatchItemWriter 来更新数据库条目。但是我在更新行时找不到任何控制提交/回滚的机制。
假设有 100 行,第 45 行发生错误,我需要回滚所有更新。
JdbcBatchItemWriter 中是否有某种方式可以显式提交或回滚事务?

编辑
Itemwriter 将数据以块的形式归档。写入块后,我需要更新数据库中的记录。数据库更新是使用 JdbcBatchItemWriter 完成的。假设 5 块写入成功,块 6 在第 45 条记录中抛出错误,我需要回滚所有块。因此我需要在 JdbcBatchItemWriter 中进行提交/回滚控制。

【问题讨论】:

    标签: java database transactions spring-batch commit


    【解决方案1】:

    默认情况下,Spring Batch 无法回滚已提交的事务。您需要做的是在另一个步骤中添加补偿逻辑,如果相关步骤失败,该步骤将被调用。

    【讨论】:

    • 我就是这么想的。谢谢
    【解决方案2】:

    提交/回滚或事务行为通常由框架提供和控制,同样适用于使用跳过的容错步骤

    假设有 100 行,第 45 行发生错误,我需要回滚所有更新。 JdbcBatchItemWriter 中是否有某种方式可以显式提交或回滚事务?

    这种行为是由 Spring Batch 自动提供的,它将被回滚并 - 通过使用跳过逻辑 - 其他 99 行将被处理和提交

    Chunkoriented processing

    面向块的处理是指一次读取一个数据, 并在事务中创建将被写出的“块” 边界。从 ItemReader 读入一个项目,然后交给 ItemProcessor 和聚合。一旦读取的项目数等于 提交间隔,整个块通过 ItemWriter,然后事务被提交。

    另见:

    【讨论】:

    • 感谢迈克尔的回复。但我在这里不是指块处理。我编写了一个自定义 ItemWriter,它将数据写入文件。该处理将分块处理。但是一旦数据写入文件,我想更新数据库中的记录。那就是我使用 JdbcBatchItemWriter 的地方。我自己写了整个逻辑。 Itemwriter 将数据分块写入文件。假设 5 个块写入成功,块 6 在第 45 条记录中抛出错误。在那种情况下,我需要回滚整个 6 个块。这就是为什么我需要在 JdbcBatchItemWriter 中进行提交/回滚控制。
    • 如果没有嵌套事务,您可能无法回滚(已经提交的)6 个块,我会尝试使用“RollbackStep”和数据库中的一些标记来删除插入的记录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 2018-05-27
    • 2015-05-13
    • 2017-06-25
    • 2017-10-06
    • 2021-06-21
    相关资源
    最近更新 更多