如何使多连接数据加载原子?

时间:2014-04-29 01:37:19

标签: python connection-pooling python-2.6 atomicity amazon-redshift

我正在用Python编写一个奇特的应用程序,它将一堆数据从S3加载到Redshift集群中。如有必要,应用程序会针对多个表发出一堆DDL,然后通过几个COPY语句将数据加载到这些表中。

为了让整个过程尽快运行,我使用了后端移植的futures modulepsycopg2's ThreadedConnectionPool来并行地在多个连接上分发DDL和加载活动。

似乎运作良好。现在我想让整个过程成为原子。

正在完成的工作非常简单。没有死锁的可能,因为任何给定的表将被更改然后加载一次。此外,可以在负载期间锁定资源。最后,Redshift supports transactions用于我感兴趣的所有活动。所以从理论上讲,我想做的事情应该是可能的。

现在我看到的选项是:

  1. 以某种方式实现ThreadedConnectionPool.commitall()ThreadedConnectionPool.rollbackall()的贫民窟。 (不幸的是,这些方法不存在。)
  2. 看看ZODB的transaction machinery,对我来说这看起来有些过分。
  3. 以自己的方式回滚部分负载。
  4. 放弃多线程方法,并在一个连接上完成所有工作。
  5. 有没有更好的方法来做到这一点,我错过了?这些选项都不是很好看。

1 个答案:

答案 0 :(得分:2)

您可以使用两阶段提交协议执行您想要的操作。

http://initd.org/psycopg/docs/usage.html#two-phase-commit-protocol-support

...如果服务器支持它,我怀疑。