【问题标题】:Batch Job Transaction批处理作业事务
【发布时间】:2011-10-11 20:57:27
【问题描述】:

假设数据库中有 100 条记录用于批处理作业,当批处理作业运行并获取这 100 条记录然后开始处理时。在处理过程中,如果第 10 条记录发生错误,那么我是否应该回滚所有已处理的 9 条记录。

我们如何设计这个场景???欢迎您提出建议。

【问题讨论】:

    标签: batch-processing


    【解决方案1】:

    我相信你在问如果如果在批处理过程中发生错误,你应该回滚成功的记录。

    您希望在提交或回滚每个事务后,以使数据库记录保持一致且合法(关于数据库和业务规则)的方式在事务中进行数据库更新。

    如果您的 100 条记录列表中的每一项都可以单独处理和记录,那么我建议使用某种标志(也可以是状态字段)来指示每条记录是否已被处理,然后循环遍历记录以更新每一个。如果您遇到错误,请注意某处(日志文件、异常、错误表...您的调用)并继续。完成后,您将记录哪些记录成功,哪些记录失败。然后,您应该能够返回并修复导致不良记录问题的任何原因,并重新处理跳过的记录。

    如果您的所有 100 条记录必须同时成功或失败,那么您需要将更新包装在事务中,以便它们全部成功或失败。这将适用于数十条记录或(可能)数百条记录,但尝试在同一事务中扩展到数千条记录可能会产生可伸缩性问题(性能和争用问题),因此您需要针对模式使用不同的解决方案像这样。

    【讨论】:

    • 感谢您的回答,实际上我只是这样实现的。我正在与其他专家一起检查他们是如何进行这种处理的,最好的方法是什么......谢谢
    【解决方案2】:

    可能有不同的事务粒度。 Java (JTA) 允许在一次提交中进行多次写入。

    1. 打开交易
    2. 写记录
    3. 写记录
    4. 写记录
    5. 错误
    6. 回滚

    大多数数据库还支持可以处理多行或记录写入的事务。

    这很常见。

    【讨论】:

    • 回滚所有成功的记录好不好?在您的示例中,直到第 4 点,一切都很好,并且在第 5 点发生错误,现在您想回滚所有成功的记录吗?如果我们提交所有成功的记录并用某个标志标记它们执行,然后批处理作业可以在下一次拾取其余记录(从第 5 点开始),你怎么看。我的问题基本上是设计这个场景的最佳方法是什么???我们应该确定批量大小,然后只回滚失败的批次,还是应该创建保存点,然后回滚到保存点???
    【解决方案3】:

    看看SAVEPOINTS - 它们基本上允许内部事务交易。所以你可以做很多工作,做一个保存点,做更多的工作,只是回滚到最后一个保存点。如果事情真的出错了,你可以回滚整个事务。

    【讨论】:

    • 最初我通过 Java 尝试了 SAVEPOINTS(我没有存储过程),但我的情况不允许这样做,而且它需要更多代码和逻辑,然后在带有状态列的数据库表中维护.. .还在那里看到了一种性能问题...感谢您的建议迈克...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多