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

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

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

【讨论】:

以上是关于如何使多连接数据加载原子化?的主要内容,如果未能解决你的问题,请参考以下文章

Cassandra创建并加载数据原子性

加载 NIB 并重新建立连接

如何在android 动态加载插件small

如何从 AWS Glue 中的 JDBC 编目连接加载部分数据?

Android 插件化插件化原理 ( JVM 内存数据 | 类加载流程 )

我应该如何构建多用途 Vue 组件以从不同的 Vuex 路径加载数据?