我正在用Python编写一个奇特的应用程序,它将一堆数据从S3加载到Redshift集群中。如有必要,应用程序会针对多个表发出一堆DDL,然后通过几个COPY
语句将数据加载到这些表中。
为了让整个过程尽快运行,我使用了后端移植的futures
module和psycopg2's ThreadedConnectionPool
来并行地在多个连接上分发DDL和加载活动。
似乎运作良好。现在我想让整个过程成为原子。
正在完成的工作非常简单。没有死锁的可能,因为任何给定的表将被更改然后加载一次。此外,可以在负载期间锁定资源。最后,Redshift supports transactions用于我感兴趣的所有活动。所以从理论上讲,我想做的事情应该是可能的。
现在我看到的选项是:
ThreadedConnectionPool.commitall()
和ThreadedConnectionPool.rollbackall()
的贫民窟。 (不幸的是,这些方法不存在。)有没有更好的方法来做到这一点,我错过了?这些选项都不是很好看。
答案 0 :(得分:2)
您可以使用两阶段提交协议执行您想要的操作。
http://initd.org/psycopg/docs/usage.html#two-phase-commit-protocol-support
...如果服务器支持它,我怀疑。