【发布时间】:2011-10-11 20:57:27
【问题描述】:
假设数据库中有 100 条记录用于批处理作业,当批处理作业运行并获取这 100 条记录然后开始处理时。在处理过程中,如果第 10 条记录发生错误,那么我是否应该回滚所有已处理的 9 条记录。
我们如何设计这个场景???欢迎您提出建议。
【问题讨论】:
标签: batch-processing
假设数据库中有 100 条记录用于批处理作业,当批处理作业运行并获取这 100 条记录然后开始处理时。在处理过程中,如果第 10 条记录发生错误,那么我是否应该回滚所有已处理的 9 条记录。
我们如何设计这个场景???欢迎您提出建议。
【问题讨论】:
标签: batch-processing
我相信你在问如果如果在批处理过程中发生错误,你应该回滚成功的记录。
您希望在提交或回滚每个事务后,以使数据库记录保持一致且合法(关于数据库和业务规则)的方式在事务中进行数据库更新。
如果您的 100 条记录列表中的每一项都可以单独处理和记录,那么我建议使用某种标志(也可以是状态字段)来指示每条记录是否已被处理,然后循环遍历记录以更新每一个。如果您遇到错误,请注意某处(日志文件、异常、错误表...您的调用)并继续。完成后,您将记录哪些记录成功,哪些记录失败。然后,您应该能够返回并修复导致不良记录问题的任何原因,并重新处理跳过的记录。
如果您的所有 100 条记录必须同时成功或失败,那么您需要将更新包装在事务中,以便它们全部成功或失败。这将适用于数十条记录或(可能)数百条记录,但尝试在同一事务中扩展到数千条记录可能会产生可伸缩性问题(性能和争用问题),因此您需要针对模式使用不同的解决方案像这样。
【讨论】:
可能有不同的事务粒度。 Java (JTA) 允许在一次提交中进行多次写入。
大多数数据库还支持可以处理多行或记录写入的事务。
这很常见。
【讨论】:
看看SAVEPOINTS - 它们基本上允许内部事务交易。所以你可以做很多工作,做一个保存点,做更多的工作,只是回滚到最后一个保存点。如果事情真的出错了,你可以回滚整个事务。
【讨论】: