Node.js 如何使用Nodejs+;Tokumx(mongodb)和#x2B;Nodejs的任何Mongodb驱动程序

Node.js 如何使用Nodejs+;Tokumx(mongodb)和#x2B;Nodejs的任何Mongodb驱动程序,node.js,tokumx,Node.js,Tokumx,你知道nodejs的TokuMX驱动程序是用来做ACID事务的吗 我想使用Databaseengine TOKUMX,它是MongoDB的一种分支,使用与mongo相同的API,但有一些内置的改进,即它使用真正的ACID事务。MongoDB的原生形式不允许使用ACID。但TOKUMX确实如此 所以,我确实用Nodejs编写我的应用程序。对于与TokuMX数据库通信所需的驱动程序,我使用节点。好消息是我可以使用该驱动程序将所有命令发送到数据库。例如: 在nodeJS代码中: mycollectio

你知道nodejs的TokuMX驱动程序是用来做ACID事务的吗

我想使用Databaseengine TOKUMX,它是MongoDB的一种分支,使用与mongo相同的API,但有一些内置的改进,即它使用真正的ACID事务。MongoDB的原生形式不允许使用ACID。但TOKUMX确实如此

所以,我确实用Nodejs编写我的应用程序。对于与TokuMX数据库通信所需的驱动程序,我使用节点。好消息是我可以使用该驱动程序将所有命令发送到数据库。例如:

在nodeJS代码中:

mycollectionblabla.runCommand('beginTransaction', function(err, res) { ....
mycollectionblabla.insert .... 
mycollectionsblabla.runCommand('commitTransaction', function(err4, res4){...
问题是,当我以非常快的速度调用程序代码好几次(比如10次)时,它不会执行ACID事务。这就开始了

runCommand('beginTransaction'... 
平行排列,当然还有

runCommand('commitTransaction', ...
失败了!!!因为它说:交易已经存在,它还说 不存在要提交的事务

你看到困扰我的问题了吗? 如何解决该问题以进行ACID事务


您知道nodejs用于执行ACID事务的TokuMX驱动程序吗?

node.js的工作方式和TokuMX多语句事务的工作方式存在一个基本问题

在TokuMX中,多语句事务(带有
beginTransaction
)与运行该命令的客户端连接相关联。在此之后,在下一个
rollbackTransaction
commitTransaction
命令之前,在同一连接上执行的任何操作都算作事务的一部分

如果您启动了一个事务,而其他线程使用了您的连接,那么它的操作将成为您事务的一部分。此外,如果启动一个线程,然后切换到另一个连接,则切换后的操作将不会与事务正确关联

我们选择这种车型的原因是,它对大多数驾驶员都有意义。对于使用连接池的具有显式线程模型的语言中的大多数驱动程序,有一种驱动机制为给定的执行线程保留连接,例如,或。在这些驱动程序中,任何想要使用TokuMX事务的线程都必须在这种保留连接的上下文中这样做

在node.js中,对于当前驱动程序(现在是AFAIK),逻辑代码组无法将自身与单个事务专门关联。这在一定程度上是因为node.js执行模型本身没有一个好的概念将一组逻辑代码(通过多个回调)绑定在一起,作为一个连接可以关联的“线程”。简单地说,没有办法告诉node“执行
beginTransaction
命令,确保没有其他人使用此连接,并且当您调用我的回调时,确保我获得对该连接的引用,以便我可以使用它进行更多操作”

现在,如果排除多语句事务,仍然可以通过node.js驱动程序从TokuMX获得一组事务语义。所有查询仍然使用MVCC快照,所有批处理插入、多文档更新和删除都以串行方式彼此隔离,甚至跨多个文档也是原子的。请记住,这些是放松在一个碎片设置;事务语义此时不会跨越碎片边界

据报道,有人正在研究这个问题。据我所知,他们应该很快就开始解决这个问题,但我与他们没有直接联系,所以我不能谈论日程安排或计划

现在,我建议您尝试使用另一个驱动程序,或者尝试以TokuMX的单语句事务语义足够的方式编写应用程序


免责声明:我是TokuMX工程师。

我将尝试使用TokuDB而不是用于NodeJ的TokuMX。对于NodeJ,我将使用名为mysql队列的NPM模块。也许这样我可以让我的应用程序的交易工作。最好的问候我也面临同样的问题。两个用户试图同时执行事务(并发)。因此,他们运行了
runCommand({beginTransaction:1})
2次。我终于得到了
事务已经存在
是的,这意味着你的用户正在使用相同的连接,这是行不通的。