是否有可能使用node.js和noSQL数据库做事务处理?

我不是在谈论真钱交易

我正在开发的这个项目是一个玩家互相交换东西的游戏。 这基本上是一个交易过程,玩家A给了玩家B 10粒去交换30头牛,你明白了。

但是因为它是互动的,并且有很多玩家同时在聊天室般的环境中进行交易,所以我想知道是否有可能用node.js做这样的事情,但是我看到了问题。

我来自数据库背景,处理事务以及rollbackcommit的性质对于维护数据库的健康状态是必要的。 但是,如果我们谈论的是node.jsmongoDB (或者其他任何的noSQL DB),那肯定是一个完全不同的思路,但我不明白它是如何处理交易的,因为只有两方应该参与而不诉诸某种forms的locking,但肯定不是什么node

我还没有find任何东西,但是这并不令我感到意外,因为node.js是如此新颖。

更新我知道一个交易的机制 – 特别是银行风格的交易,但这不是一回事。 我可能没有说清楚,但问题是,玩家B正在向买家群体出售东西。

这意味着虽然玩家A在客户端发起购买指令,但是也可能在同一时间玩家CD或E也点击购买相同的牛。

现在在正常的交易中,预计至less第一个获得logging级别表的人至less阻止其他方在那个时间点进行操作。

然而,使用节点的性质,特别是其速度,并发处理和显示实时更新数据库的使用意味着我可以很容易想象,最慢的人(我们正在说毫秒)获胜。

例如,玩家A在玩家C的同时启动购买。玩家交易完成,并且向玩家B付钱,并且在数据库上将玩家A分配给玩家A. 一毫秒后牛被分配给玩家C.

我希望能更好地解释这个问题。

这与Node.JS无关。 Node.JS只连接到数据库,事务是由数据库本身完成的(除非你想在Node.JS中手动实现事务,这可能有点困难 – 但任何语言编写的Web服务器都是这样的)。

你可以很容易地使用MySQL(例如)支持事务的Node.JS。 所以你问的问题是:我可以做与MongoDB交易? 答案是:不,是的。

不,因为MongoDB不支持开箱即用的交易。

是的,因为你可以使用一些技巧来模拟交易。 例如看这篇文章 。

我正在为node.js的一个oss应用程序级事务数据库(名为Waterline)工作 。

我们从CRUD模式开始,但很快就意识到这很难。 最好把它留给数据库。 但有时你不想 – 因为你想能够切换数据库并保持你的代码不可知。 那么我们简化到下一个最简单的命名交易。

所以,没有内置的回滚支持(现在你仍然需要这样做),但至lessWaterline会阻止你同时访问。

在你的例子中(假设你在express / connect / Sails中 ),它可能看起来像这样:

 function buyCow (req,res) { Cow.find(req.param('cowId'),function (err,cow) { if (err) return req.send(500,err); Cow.transaction('buy_cow',function (err, unlock) { if (err) { // Notice how I unlock before each exit point? REALLY important. // (would love to hear thoughts on an easier way to do this) unlock(); return res.send(500,err); } User.find(req.session.userId,function (err,user) { // If there's not enough cash, send an error if (user.money - cow.price < 0) { unlock(); return res.send(500,'Not enough cash!'); } // Update the user's bank account User.update(user.id,{ money: user.money - cow.price }, function (err,user) { if (err) { unlock(); return res.send(500,err); } Cow.update(cow.id, {owner: user.id}, function (err, cow) { if (err) { unlock(); return res.send(500,err); } // Success! unlock(); res.json({success: true}); }); }); }); }); }); } 

希望有所帮助。 我欢迎您的反馈(也许提交?)

要使用文档数据库进行银行风格的交易,通常使用事务日志模式。 在这个模式中,你要把每个事务写成自己的文档。 您不保留与每个帐户余额相对应的文件。 相反,您在查询时间滚动交易文件,以提供当前余额。

这是一个适用于Couchbase map reduce的示例: http : //guide.couchdb.org/draft/recipes.html