我正在数据库中构建一个进程,其中多个表用于在单个表中写入数据(每个表在单个进程中(。该过程应该是容错的 - 如果发生错误,应回滚所有插入的数据。在我看来,有两种方法可以实现这种逻辑整体数据库系统。
- 在一个进程开始时,我锁定了目标数据库,所有其他进程都必须等到这个过程完成(不可能进行真正的并行处理(
- 每个进程将数据写入 tmp 表中,最后它们可以批量加载目标中的所有数据。(跟踪哪些数据已经导出等(
对于这种或问题,是否有更多/更好的选择?
干杯
考虑到行数 (1m( 以及您将每 5 分钟运行一次进程的事实,我认为您提到的任何一种方法都不适合 -
- 第一种方法会过于频繁和长时间锁定目标表
- 第二种方法是插入大量数据,然后在最后提交或回滚。根据您使用的数据库 - 如此大量的未提交数据可能会导致性能问题。最后的回滚也会给数据库带来大量负载。
你可以尝试的是——
-
在目标表中批量插入和提交数据(例如 5K 条记录 - 您需要在测试各种批大小后对其进行调整(
-
挑战在于 - 在整个过程成功完成之前,没有人应该能够使用提交的数据。为了解决这个问题,
- 创建一个名为 process_stats 的表(process_id,状态(
- 每次启动流程时,在此表中插入一个状态为"已启动"的条目。该过程结束时,将状态更改为"成功"或"失败">
- 从目标表中引用此表(因此向目标表添加一个名为 process_id 的列(
- 最后,任何读取目标表的查询都应将目标表与process_stats表联接,并且仅在流程状态为"成功"时才选择记录
- 如果进程失败,您可以选择从目标表中删除相应的记录
这将确保 -
- 以较小的批次提交数据
- 没有大的提交或回滚
- 加载过程中没有明显的锁定/暂停
缺点-
- 读取目标表的所有查询都需要额外的联接