关于python:如何使多连接数据加载原子化?

How do I make a multi-connection data load atomic?

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

为了使整个过程尽可能快地运行,我利用了反向移植的futures模块和psycopg2的ThreadedConnectionPool在多个并行连接中分布DDL和负载活动。

它似乎运作良好。现在,我想使整个过程变得原子化。

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

现在我看到的选项是:

  • 以某种方式实现ThreadedConnectionPool.commitall()ThreadedConnectionPool.rollbackall()的贫民窟等效项。 (不幸的是,这些方法不存在。)
  • 看一下ZODB的交易机制,就我的目的而言,这似乎有些过头了。
  • 用我自己的方式回滚部分负载。
  • 放弃多线程方法,并在单个连接上完成所有操作。
  • 是否有更好的方法来做我错过的事情?这些选项都不是很好。


    您可以使用两阶段提交协议来执行所需的操作。

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

    ...如果服务器支持它,我对此表示怀疑。