如何使多连接数据加载原子化?
Posted
技术标签:
【中文标题】如何使多连接数据加载原子化?【英文标题】:How do I make a multi-connection data load atomic? 【发布时间】:2014-04-29 01:37:19 【问题描述】:我正在用 Python 编写一个精美的应用程序,它将一堆数据从 S3 加载到 Redshift 集群中。如有必要,应用程序会针对多个表发出一堆 DDL,然后通过多个 COPY
语句将数据加载到这些表中。
为了使整个过程尽可能快地运行,我使用了向后移植的futures
module 和psycopg2's ThreadedConnectionPool
来在多个并行连接之间分配 DDL 和加载活动。
它似乎运作良好。现在我想让整个过程原子化。
所做的工作非常简单。没有死锁的可能性,因为任何给定的表都将被更改,然后只加载一次。此外,可以在加载期间锁定资源。最后,对于我感兴趣的所有活动,Redshift supports transactions。所以理论上,我想做的事情应该是可能的。
现在我看到的选项是:
-
以某种方式实现
ThreadedConnectionPool.commitall()
和 ThreadedConnectionPool.rollbackall()
的 ghetto 等效项。 (很遗憾,这些方法不存在。)
看看 ZODB 的 transaction machinery,对我来说这看起来有点过头了。
采用我自己的方式来回滚部分负载。
放弃多线程方法,在单个连接上完成所有工作。
有没有我错过的更好的方法来做到这一点?这些选项都不是很好。
【问题讨论】:
【参考方案1】:你可以使用两阶段提交协议做你想做的事。
http://initd.org/psycopg/docs/usage.html#two-phase-commit-protocol-support
...如果服务器支持,我对此表示怀疑。
【讨论】:
以上是关于如何使多连接数据加载原子化?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 AWS Glue 中的 JDBC 编目连接加载部分数据?