ACID与Nodejs + Tokumx(mongodb)的交易+ Nodejs的任何Mongodb驱动程序

你知道任何TokuMX驱动nodejs进行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 Transactions。 它开始了

 runCommand('beginTransaction'... 

在平行,当然是

 runCommand('commitTransaction', ... 

确实失败! 因为它说:事务已经存在,它也说没有事务存在被提交… !!!

你看到困扰我的问题? 我怎样才能解决这个问题,使ACID交易?

你知道任何TokuMX驱动nodejs进行ACID事务吗?

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

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

如果你开始一个交易,而其他一些线程使用你的连接,它的操作将成为你的交易的一部分。 另外,如果您启动一个线程,然后切换到另一个连接,交换机之后的这些操作将不会正确地与事务关联。

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

在node.js中,使用当前的驱动程序(AFAIK),没有办法让一个逻辑代码组将自己与一个单独的事务关联起来。 这部分是因为node.js执行模型本身没有一个好的概念,它把一个逻辑代码组(通过多个callback)连接成一个连接可以关联的“线程”。 简单地说,没有办法告诉节点“执行beginTransaction命令,确保没有其他人使用这个连接,当你调用我的callback函数时,确保我得到了连接的引用,所以我可以用它来做更多的事情。

现在,如果排除多语句事务,仍然可以使用node.js驱动程序从TokuMX获取一组事务语义。 所有的查询仍然使用MVCC快照,所有批量插入和多文档更新和删除是可串行地相互隔离的,甚至在多个文档中也是primefaces的。 请记住,这些在分散的环境中是放松的; 事务性语义在这个时候不会跨越分界线。

有一个项目BlueRival / node-tokumx-native是据说正在处理这个问题的人。 根据他们的github问题之一,他们应该尽快就这个问题开始工作,但我不直接与他们联系,所以我不能说时间表或计划。

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

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