【问题标题】:Batch Import dry run - transaction rollback a terrible idea?批量导入试运行——事务回滚是个糟糕的主意?
【发布时间】:2014-09-19 10:15:28
【问题描述】:

我正在开发一个批量导入 API,它需要一个“预览”功能,向用户显示导入文件时每种类型将创建多少条记录。通常批处理中不会有很多记录 - 10,000 条是一个现实的上限 - 但系统目前相当慢,这样的导入可能需要十分钟或更长时间。鉴于我们希望批量导入尽可能接近实际导入(即数据库约束/触发器、事件处理程序触发等),实现此预览功能的最佳方法是什么?

在事务中进行批量导入然后将其回滚是一个糟糕的主意吗?我不确定我们只是在插入数据时会发生什么锁定行为......这似乎是一个简单的解决方案,但我的蜘蛛侠感觉告诉我这是一个糟糕的解决方案。

谢谢!

【问题讨论】:

    标签: sql transactions batch-processing transactionscope


    【解决方案1】:

    在事务中进行批量导入然后将其回滚是一个糟糕的主意吗?

    是的。 10 分钟的交易将是一场灾难。至少它固定日志,防止截断,导致日志增长。但更有可能导致系统大规模中断,因为其他所有东西都阻塞在这个长期未提交事务获得的锁后面。

    如果您只需要向用户显示估计的计数,那么做真正的工作只是为了被丢弃是一种可怕的资源浪费。您将导致 10 分钟中断只是为了给出估计计数,然后回滚,然后再次导致相同的 10 分钟中断!

    我会认真重新考虑显示这个估计计数的要求以及所有副作用。基本上,除了做真正的工作之外没有其他办法,此时你最好只做一次工作。甚至像处理备份数据库这样的事情也可能是不现实的,因为大多数数据库都具有跨数据库依赖关系(例如,触发器可能会导致插入到不同的数据库并具有真实的、不那么干燥的副作用)。

    更现实的要求是向用户显示源文件的记录计数(“foo.txt 中有 9876 条记录”),这可以通过解析源文件轻松完成。

    【讨论】:

    • 谢谢,这完全符合我的担心。我们将放弃这个想法,只计算请求中的有效对象。
    猜你喜欢
    • 2010-09-10
    • 1970-01-01
    • 2018-08-17
    • 2012-03-20
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    相关资源
    最近更新 更多