MongoDB中的原子与转移资金

时间:2013-05-04 08:58:41

标签: mysql mongodb innodb nosql

我是MongoDB的新手 我在bank中创建一个简单的应用程序abount帐户。一个帐户可以将钱转移给其他人 我设计了像那样的帐户集合

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

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

假设用户A为用户B转移100 $,则有2个操作: 1)在文档A的用户A //更新中减少100 $ 2)用文件B为用户B //更新增加100 $ 它说原子只适用于单个文件而不适用于多个文件。

我有改变设计

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

我有一些问题:

  
      
  • 如果我以后使用,我怎样才能编写事务查询(我可以使用findAndModify()函数吗?)?
  •   
  • MongoDB是否支持Mysql(InnoDB)等事务操作?
  •   
  • 有些人告诉我,使用Mysql这个项目是最好的方法,只使用MongoDB来保存交易信息。(使用额外的   名为Transaction_money的集合用于保存它们,如果我同时使用它们   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
}

非常感谢。

2 个答案:

答案 0 :(得分:2)

我不确定这是你在找什么:

db.bank.update({name : "name"},{ "$inc" : {'Account.0.money' : -100, 'Account.1.money' : 100}})
  • update()操作满足(ACID)的ACI属性。持久性(D)取决于进行查询时的mongo和应用程序配置。
  • 您可以更喜欢使用不会导致页面错误锁定的findAndModify()
  • MongoDB在文档中提供交易

我无法理解,如果您的应用程序要求非常简单,那么为什么要尝试使用mongodb。毫无疑问它是一个很好的数据存储,但我想MySql将满足您的所有要求。

仅供参考:有一个文档正是您要解决的问题。 http://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/ 但我不建议您使用它,因为单个查询(转移资金)已经变成了查询序列。

希望有所帮助

答案 1 :(得分:1)

  

如果我以后使用,我怎样才能编写事务查询(我可以使用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可以采取安全预防措施来确保数据在任何时候都是一致的。

回到你的上一个问题:

  

有些人告诉我,使用Mysql这个项目是最好的方法,只使用MongoDB来保存事务信息。(使用名为Transaction_money的额外集合来保存它们),如果我同时使用MongoDB和Mysql(InnoDB)如何可以使下面的一些操作是原子的(失败或成功整体):

我会说比MySQL个人更健壮的东西,我听说MSSQL对此非常好。