如何在Nodejs + Tokumx(mongodb)+任何Nodejs上的Mongodb驱动程序中使用ACID事务

4

你知道有没有用于NodeJS的TokuMX驱动程序来执行ACID事务吗?

我想要使用数据库引擎TOKUMX,它是MongoDB的一种分支,使用与Mongo相同的API,但具有内置的改进功能,即使用真正的ACID事务。 MongoDB在其原生形式下不允许ACID。 但是TOKUMX允许。

因此,我会用Nodejs编写我的应用程序。为了与TokuMX数据库通信所需的驱动程序,我使用node-mongolian。好消息是我可以使用该驱动程序将所有命令发送到数据库。例如:

在NodeJS代码中:

mycollectionblabla.runCommand('beginTransaction', function(err, res) { ....
mycollectionblabla.insert .... 
mycollectionsblabla.runCommand('commitTransaction', function(err4, res4){...

问题在于,当我快速地连续调用该程序代码十次时,它不会执行ACID事务。然后它开始了...
runCommand('beginTransaction'... 

同时,并且当然还有

runCommand('commitTransaction', ...

失败了!!!因为它说:事务已经存在,同时也说没有要提交的事务...!!!

您看到困扰我的问题了吗? 我该如何解决这个问题以实现ACID事务?

您知道有没有适用于nodejs的TokuMX驱动程序以进行ACID事务?

1个回答

6

node.js的工作方式和TokuMX多语句事务的工作方式存在根本性问题。

在TokuMX中,使用beginTransaction的多语句事务与运行该命令的客户端连接相关联。在此之后,直到下一个rollbackTransactioncommitTransaction命令,对同一连接进行的任何操作都将计入事务。

如果您开始一个事务并且其他线程使用了您的连接,则其操作将成为您的事务的一部分。此外,如果您启动一个线程,然后切换到不同的连接,则切换后的操作将无法正确地与事务关联。

我们选择这个模型的原因是它对大多数驱动程序都有意义。对于大多数使用连接池的显式线程模型语言,都有一种驱动程序机制来为给定的执行线程保留连接,例如start_request in PyMongoRequestStart in the MongoDB C# driver。在这些驱动程序中,想要使用TokuMX事务的任何线程都必须在这样一个保留连接的上下文中进行。
在Node.js中,目前的驱动程序(据我所知)没有办法让逻辑代码组独占一个事务。这部分原因是因为在Node.js执行模型本身中没有很好的概念将逻辑代码组(通过多个回调函数)绑定在一起,作为一个“线程”,使连接能够关联。简而言之,没有办法告诉Node.js:“执行beginTransaction命令,确保没有其他人使用此连接,并且当您调用我的回调时,请确保我获得连接的引用,以便我可以用它做更多的事情”。
现在,如果排除多语句事务,您仍然可以从TokuMX和Node.js驱动程序获取一组事务性语义。所有查询仍使用MVCC快照,并且所有批量插入、多文档更新和删除都与彼此串行隔离,并且即使跨多个文档,也是原子的。请记住,在分片设置中,这些语义是放松的;当前不支持跨分片边界的事务性语义。

有一个项目BlueRival/node-tokumx-native,据报道有人正在解决这个问题。根据他们的github问题之一,他们应该很快开始解决这个问题,但我与他们没有直接联系,所以无法谈论时间表或计划。

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

声明:我是TokuMX工程师。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接