批量导入干运行 - 事务回滚一个可怕的想法?

时间:2014-09-19 10:15:28

标签: sql transactions batch-processing transactionscope

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

  

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

是。 10分钟的交易将是一场灾难。它至少会固定日志,防止截断,导致日志增长。但更有可能导致系统大量中断,因为其他一切都阻碍了这种长期未提交交易所获得的锁定。

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

我会认真重新考虑显示所有副作用的估计计数的要求。基本上,没有办法把它放在做真正的工作之外,此时你最好只做一次工作。即使是在备份数据库上工作也可能是不切实际的,因为大多数数据库都存在跨数据库依赖关系(例如,触发器可能会导致插入到不同的数据库中,并且具有真实的,不那么干燥的副作用)。

更现实的要求是向用户显示源文件的记录计数(" foo.txt和#34中有9876记录;),这可以通过解析源文件轻松完成(一个或多个)。