Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js nodeJS应用中的两阶段提交_Node.js_Postgresql_Transactions_Commit_Pg Promise - Fatal编程技术网

Node.js nodeJS应用中的两阶段提交

Node.js nodeJS应用中的两阶段提交,node.js,postgresql,transactions,commit,pg-promise,Node.js,Postgresql,Transactions,Commit,Pg Promise,我目前正在开发一个nodeJS应用程序,该应用程序很快将需要在两个PostgreSQL数据库上同时编写。这是为了进行冗余:写入操作必须在两个数据库上同时进行,如果其中一个数据库有任何问题,则必须回滚 为了实现这一点,我需要依赖一个事务管理器,它将(或至少可以)在持久化过程中使用两阶段提交 目前,应用程序使用现成的解决方案在当前数据库上执行操作(即pg promise包,目前它是应用程序的事务管理器) 简而言之,我需要在两个数据库上同时执行节点应用程序中的每个持久化操作 目前,我仅使用pg pro

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

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

目前,应用程序使用现成的解决方案在当前数据库上执行操作(即pg promise包,目前它是应用程序的事务管理器)

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

目前,我仅使用pg promise将数据持久保存在一个数据库上,如本例所示:

db.one(mySQLRequest)
但我发现一次只能为一个特定的数据库创建一个db对象

我还没有在NodeJS RESTful应用程序中发现如此大的问题,但我怀疑这可能是一个相当常见的问题。如果不需要我自己重新编码整个事务管理器,我会很高兴

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

nodeJS应用程序,很快将需要在多个PostgreSQL数据库上同时写入

在每个对象中包含一个单独的连接池,具有唯一的连接

因此,在与多个数据库通信时,您只需为每个数据库创建一个对象,在这种情况下,最好使用
数据库上下文
参数,该参数可以是任何对象

示例

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

const db1 = pgp(connection1, dbContext1);
const db2 = pgp(connection2, dbContext2);
const db3 = pgp(connection3, dbContext3);
我必须在持久化过程中实现两阶段提交

这必须是一个自定义实现,它取决于应用程序的业务逻辑。在这方面,库不能帮助您,因为没有数据库间事务,您必须自己实现它

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


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

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

如果您正在自己开发一个卷,请查看XA事务,这是一种分布式数据库事务标准。Java通过JTA(Java事务API)提供了强大而成熟的支持,JTA只作为灵感和参考帮助节点开发人员

postgresql已经提供了构建块,可以支持XA,也可以支持特定于postgresql的手动实现


我自己也在做一个XA-ish事务管理器,但是工作和孩子的工作进展会很慢;次要项目是时间的最后一项。在一两年内寻找
ivolucien/coaction

“我必须在持久化过程中实现两阶段提交”相反,外部事务管理器必须实现两阶段提交?(不确定PostgreSQL如何处理分布式事务。)无论如何,实现者不太可能是您。
two-phase commit
听起来像是一个嵌套事务,pg promise很好地支持它。您应该包括一个代码示例,说明您正在尝试执行的操作,并解释哪些操作不起作用。@vitaly-t:在几个PostgreSQL数据库上同时写入这句话让我觉得更像是分布式事务,而不是嵌套事务。但你是对的——需要更多的代码,或者至少需要更多的细节。我会努力改进我的问题,让它更清晰。我想我的观点更多的是关于分布式事务,因为应用程序中的所有持久化操作必须在两个数据库上同时执行。谢谢您的回答。我试图改进我的问题,如果我仍然不清楚,请告诉我。谢谢你的回答。使用两个数据库连接可能是一个想法,但为了执行两阶段提交,我希望这两个对象能够通信,以便知道它们是否以及何时能够在数据库中实际写入。是否可以通过dbContext参数对其进行参数化?@Pikuni dbContext参数有助于区分两个数据库的扩展、事件记录等。但是,它们之间的通信完全取决于您,因为数据库对象彼此完全独立。好的,这使事情更清楚了。然而,我担心pg promise的一般功能将不适合这种情况。事实上,我需要在两个数据库上准备一个类似的事务,正如上所述。从我所看到的情况来看,pg promise对交易的整个处理方式(以正常方式)是不同的。我看不出如何使用预先准备好的语句来实现它。@pg promise的Pikuni通用功能适用于任何通用目的,包括可能需要的任何自定义事务逻辑。我不确定准备好的语句和它有什么关系,它只是一种查询类型。抱歉,使用了错误的URL,并混淆了准备好的语句和准备事务命令,尽管没有连接。我是说,谢谢你的回答。我将与您的工作保持联系,因为正如您所提到的,似乎没有用于分布式事务管理的节点模块。至于我,我通过使用PgPool II中间件在两个主数据库之间分配事务来解决这个问题。不幸的是,PgPool II并不是为此而设计的,实现起来相当痛苦。因此,我认为节点社区肯定会使用您的工作。;)