nodeJS应用程序中的两阶段提交

时间:2018-05-22 15:38:12

标签: node.js postgresql transactions commit pg-promise

我目前正在开发一个nodeJS应用程序,它很快就需要在两个PostgreSQL数据库上同时编写。这是为了减少目的:写入操作必须在两个数据库上同时 ,或者如果其中一个数据库有任何问题,则回滚。

为了实现这一目标,我需要依赖一个事务管理器,它将(或者至少可以)在持久化过程中使用两阶段提交

目前,该应用程序使用开箱即用的解决方案对当前数据库执行操作(即 pg-promise 包,该包现在作为应用程序' s交易经理)。

简而言之,我将需要Node应用程序中的每个持久操作同时在两个数据库上执行。

现在,我只是使用pg-promise将数据保存在一个数据库上,就像这个例子一样:

db.one(mySQLRequest)

但我发现一次只能为一个特定的数据库创建一个db对象。

我在NodeJS RESTful应用程序上找不到这么多问题的例子,但我怀疑这可能是一个相当普遍的问题。如果我没有必要自己重新编写整个交易管理器,我会很高兴...

如果您对我如何允许我的NodeJS应用程序执行两阶段提交有任何指导意见,我们将不胜感激。 :)

2 个答案:

答案 0 :(得分:2)

我已经搜索并没有找到用于分布式事务管理的任何node.js模块。

如果您是劳资双方,请看看XA事务(一种分布式数据库事务标准)。 Java通过JTA(Java事务处理API)提供了强大而成熟的支持,该帮助仅作为节点开发人员的灵感和参考。

postgresql具有two phase commit support,因此可以使用XA支持或手动滚动的postgresql特定实现的构建块。

我本人是一名XA ish事务管理器的工作人员,但是工作和孩子们的工作将会很慢。副项目的时间紧迫。在一年或两年内寻找ivolucien/coaction ...

答案 1 :(得分:1)

  

nodeJS应用程序,很快就需要在几个PostgreSQL数据库上同时编写

pg-promise内,每个Database对象都包含一个单独的连接池,具有唯一的连接。

因此,在与多个数据库进行通信时,您只需为每个数据库创建一个Database对象,在这种情况下,最好使用Database Context参数,这可以是任何内容。 / p>

示例

const pgp = require('pg-promise')(/* initialization options */);

const db1 = pgp(connection1, dbContext1);
const db2 = pgp(connection2, dbContext2);
const db3 = pgp(connection3, dbContext3);
  

我必须在持久化过程中实现两阶段提交

这必须是一个依赖于应用程序业务逻辑的自定义实现。图书馆无法帮助你,因为没有数据库间交易,你必须自己实现它。

  

我甚至想过自己重写pg-promise模块的某些部分

我不知道它能给你什么。可以为事务自动化的部分已经存在,而数据库间完整性的部分都在您的身边。