原子MongoDB中与转移金钱

原子MongoDB中与转移金钱

问题描述:

我是新MongoDB的 我做一个简单的应用程序在bank.an帐户abount帐户可以汇款给别人 我设计的帐号收集这样的原子MongoDB中与转移金钱

account 
{ 
     name:A 
     age: 24 
     money: 100 
} 

account 
{ 
     name:B 
     age: 22 
     money: 300 
} 

假设用户用户B转账100 $,有2个操作: 1)用户A减少100 $ //文件A的更新 2)用户B增加100 $ //用文档B更新 它表示只应用原子仅适用于单个文档但不包含多个文档。

我有一个ALTER desgign

Bank 
{ 
     name: 
     address: 
     Account[ 
     { 
     name:A 
     age: 22 
     money: SS 
}, 
{ 
     name:B 
     age: 23 
     money: S1S 
} 
] 
} 

我有一些问题:

  • 如果我使用后的方式,我怎么能写交易查询(我可以使用findAndModify()函数? )?
  • MongoDB是否支持像Mysql(InnoDB)这样的事务操作?如果我同时使用了 MongoDB和Mysql(InnoDB) )如何才能让下面的一些操作是 原子(失败或成功全):
> 1) -100$ with user A 
> 2) +100$ with user B 
> 3) save transaction 

信息,如

transaction 
{ 
    sender: A 
    receiver: B 
    money : 100 
    date: 05/04/2013 
} 

非常感谢。

+0

您的第二个建议是要求单个银行的所有银行帐户都适合单个16MB BSON文档。如果没有交易,您将无法安全地跨银行或文件转账。此外,银行文件上会有很多争论。与其他交易型RDBMS选项相比,MongoDb不适合用于银行账户。 – WiredPrairie 2013-05-04 12:00:30

+0

非常感谢你 – user2349279 2013-05-04 13:30:48

+0

嗨WiredPrairie,我有一个问题,当用户A在后来的设计中向用户B转账资金时,文档被锁定,其他用户无法执行交易?谢谢。 – user2349279 2013-05-05 07:48:46

我不知道这是你在找什么:

db.bank.update({name : "name"},{ "$inc" : {'Account.0.money' : -100, 'Account.1.money' : 100}}) 
  • 更新()操作(酸)的满足ACI性能。在进行查询时,耐久性(D)取决于mongo和应用程序配置。
  • 你可以喜欢使用findAndModify(),它不会在页面错误产生锁
  • 的MongoDB提供

文档中的数据我不明白,如果你的应用程序的要求是很简单的,然后你为什么试图使用mongodb。毫无疑问,它是一个很好的数据存储,但我想MySql将满足您的所有需求。

只是供参考:有一个文档,正是你正在试图解决的问题。 http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/ 但我不会推荐你使用这个,因为一个单一的查询(转移资金)已被转化为查询序列。

希望它帮助

+0

谢谢,这只是一个我想用MongoDB做的简单测试,我想知道MOngoDB如何解决这个问题。 – user2349279 2013-05-04 19:34:31

如果我使用后的方式,我怎么能写交易查询(我可以使用findAndModify()函数?)?

有很多关于findAndModify做什么的错误概念;这不是一个交易。这是说它是原子,这是完全不同的。

的原因有两个阶段提交,并在这个意义上的交易是为了让如果出了问题,你可以解决它(或者至少有99.99%的机会没有发生腐败)

问题与findAndModify是它没有这种交易行为,不仅如此,但MongoDB只在单个文档级别提供原子状态,这意味着,在同一个调用中,如果你的函数改变多个文档,你实际上可能有一个不一致的中间在你的数据库中的数据。当然,这对于资金处理来说不会这样做。

注意到,在这些场景中,MongoDB并不是非常好,并且您试图使用MongoDB远离其目的,考虑到这一点,很明显,您没有很好地研究过您的问题,因为您的下一个问题显示为:

不MongoDB的支持事务的操作像MySQL(InnoDB的)?

不,它不需要。

与所有的背景资料放在一边,让我们看看你的架构:

Bank 
{ 
     name: 
     address: 
     Account[{ 
     name:A 
     age: 22 
     money: SS 
    },{ 
     name:B 
     age: 23 
     money: S1S 
    }] 
} 

这是事实,你可以得到在这里交易的查询,其中该文件将永远无法存在状态在两者之间,只有一个或另一个;因此不存在不一致的情况。

但是,我们必须更多地谈论真实的世界。 MongoDB中的文档大小为16MB。我不认为你会把整个银行合并到一个文档中,所以这个模式被严格计划和无用。

相反,你将需要(也许)每个账户持有人文件在你的银行,其账户的子文档。有了这个,你现在有可能发生不一致的问题。

作为@Abhishek状态,MongoDB确实支持客户端2阶段提交,但这些在数据库本身内不会像服务器端那样好,因此mongod可以采取安全预防措施以确保数据在一直。

所以回到你的最后一个问题:命名Transaction_money到

一些pepple告诉我,使用MySQL这个项目是最好的方式,而仅仅只用MongoDB中保存交易信息(使用额外的收集保存),如果我使用的MongoDB和MySQL都(InnoDB的)如何才能让下面的一些操作是原子的(失败或成功全):

我想说的东西比MySQL更强大的一点个人而言,我听到MSSQL对此非常好。

+0

非常感谢,对我很有帮助。 – user2349279 2013-05-04 19:35:27