4

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

我想使用 Databaseengine 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){...

问题是,当我以非常快的速度多次调用该程序代码(例如 10 次)时,它不会执行 ACID 事务。它开始

runCommand('beginTransaction'... 

并行,当然还有

runCommand('commitTransaction', ...

确实失败了!!!因为它说:事务已经存在,并且还说不存在要提交的事务... !!!

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

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

4

1 回答 1

5

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

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

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

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

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

现在,如果排除多语句事务,仍然可以使用 node.js 驱动程序从 TokuMX 获得一组事务语义。所有查询仍然使用 MVCC 快照,并且所有批量插入以及多文档更新和删除都是可串行隔离的,即使跨多个文档也是原子的。请记住,这些在分片环境中是放松的;此时事务语义不会跨越分片边界。

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

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

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

于 2014-05-23T17:29:27.737 回答