gpt4 book ai didi

node.js - 如何使用 Nodejs + Tokumx (mongodb) + 任何用于 Nodejs 的 Mongodb 驱动程序进行 ACID 事务

转载 作者:搜寻专家 更新时间:2023-10-31 23:09:31 24 4
gpt4 key购买 nike

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

我想使用数据库引擎 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 驱动程序吗?

最佳答案

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

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

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

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

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

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

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

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

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

关于node.js - 如何使用 Nodejs + Tokumx (mongodb) + 任何用于 Nodejs 的 Mongodb 驱动程序进行 ACID 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23830385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com