【问题标题】:Is Mongodb's lack of transaction a deal breaker?Mongodb 缺乏交易是否会破坏交易?
【发布时间】:2014-07-22 19:23:12
【问题描述】:

我一直在做一些研究,但已经到了我认为 MongoDB/Mongoose(在 Node.js 上)不是适合这项工作的工具的地步。这是场景...

两个文件:账户(钱)信息和库存信息

  1. 检查用户帐户是否有足够的钱
  2. 如果有,请检查并扣除库存
  3. 从账户信息中扣除资金

看来我真的需要一个事务系统来防止其他事件在步骤之间更改数据。

我是否正确,或者这仍然可以在 MongoDB/Mongoose 中处理?如果没有,是否有我应该检查的 NoSQL 数据库,最好支持 Node.JS?

【问题讨论】:

  • 我的同事对 SQL 不满。 “我知道,”他说,“我会用一个巨大的键/值存储来代替。”现在他有两个问题。
  • How to move money with MongoDB? 的可能重复项

标签: node.js mongodb mongoose nosql


【解决方案1】:

在您进行帐户和库存检查和更新时,您始终可以在应用程序中实施自己的锁定机制,以锁定应用程序的其他部分。结合 findAndModify() http://docs.mongodb.org/manual/reference/command/findAndModify/#dbcmd.findAndModify 可能足以满足您的事务需求,同时还保持 NoSQL 解决方案的灵活性。

对于分布式锁,我会看 Warlock https://www.npmjs.org/package/node-redis-warlock 我自己没有使用过它,但它是基于 node.js 并构建在 Redis 之上的,尽管通过 Redis 实现你自己的锁并不难开始。

【讨论】:

  • 你知道锁定机制加上 findAndModify 的任何例子吗?
  • 好吧,我们在这里内部进行 - 我们使用一个简单的基于 Redis 的锁定机制来限制对 MongoDB 中某些文档的访问。基本上是一个原始的分布式锁,对我们来说已经足够好了。我提到了 Warlock,因为它看起来是一个相当强大的 node.js 包。最后,您需要确定自己需要有多强大并相应地进行设计。
【解决方案2】:

实现事务安全通常很棘手,并且需要的不仅仅是数据库上的事务,例如如果您需要以可靠的方式与外部各方沟通,或者交易运行时间超过几分钟、几小时甚至几天。但这会导致很远。

无论如何,在 db 方面,您可以使用 two-phase commits 在 MongoDB 中进行事务处理,但这并不完全是微不足道的。

有大量的 NoSQL 数据库支持事务,例如redis、cassandra(使用Paxos protocol)和foundationdb

但是,这对我来说似乎相当随机,因为 NoSQL 数据库的想法是使用适合您特定问题的数据库。如果您只需要事务的“任何东西”,SQL 数据库就可以完成这项工作,对吧?

【讨论】:

  • 我正在寻找一个学习 NoSQL 的好理由 :) 如果它们都不符合要求,我将查看 SQL 数据库。
猜你喜欢
  • 2014-11-25
  • 1970-01-01
  • 1970-01-01
  • 2016-08-06
  • 2014-12-31
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多