数据供应过程 从单个表中的多个表插入



我正在数据库中构建一个进程,其中多个表用于在单个表中写入数据(每个表在单个进程中(。该过程应该是容错的 - 如果发生错误,应回滚所有插入的数据。在我看来,有两种方法可以实现这种逻辑整体数据库系统。

  1. 在一个进程开始时,我锁定了目标数据库,所有其他进程都必须等到这个过程完成(不可能进行真正的并行处理(
  2. 每个进程将数据写入 tmp 表中,最后它们可以批量加载目标中的所有数据。(跟踪哪些数据已经导出等(

对于这种或问题,是否有更多/更好的选择?

干杯

考虑到行数 (1m( 以及您将每 5 分钟运行一次进程的事实,我认为您提到的任何一种方法都不适合 -

  • 第一种方法会过于频繁和长时间锁定目标表
  • 第二种方法是插入大量数据,然后在最后提交或回滚。根据您使用的数据库 - 如此大量的未提交数据可能会导致性能问题。最后的回滚也会给数据库带来大量负载。

你可以尝试的是——

  1. 在目标表中批量插入和提交数据(例如 5K 条记录 - 您需要在测试各种批大小后对其进行调整(

  2. 挑战在于 - 在整个过程成功完成之前,没有人应该能够使用提交的数据。为了解决这个问题,

    • 创建一个名为 process_stats 的表(process_id,状态(
    • 每次启动流程时,在此表中插入一个状态为"已启动"的条目。该过程结束时,将状态更改为"成功"或"失败">
    • 从目标表中引用此表(因此向目标表添加一个名为 process_id 的列(
    • 最后,任何读取目标表的查询都应将目标表与process_stats表联接,并且仅在流程状态为"成功"时才选择记录
    • 如果进程失败,您可以选择从目标表中删除相应的记录

这将确保 -

  1. 以较小的批次提交数据
  2. 没有大的提交或回滚
  3. 加载过程中没有明显的锁定/暂停

缺点-

  1. 读取目标表的所有查询都需要额外的联接