3

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

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

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

假设用户 A 为用户 B 转账 100$,有 2 个操作: 1) 用户 A 减少 100$ // 更新文档 A 2) 用户 B 增加 100$ // 更新文档 B 它说原子只适用仅适用于单个文档,但没有多个文档。

我有一个改变设计

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
}

非常感谢。

4

2 回答 2

4

我不确定这是您要找的东西:

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/ 但我不建议您使用它,因为单个查询(转账)已变成查询序列。

希望它有所帮助

于 2013-05-04T10:47:23.457 回答
1

如果我使用后一种方式,我该如何编写事务查询(我可以使用 findAndModify() 函数吗?)?

关于做什么有很多误解findAndModify;这不是交易。话虽如此,它是原子的,这是完全不同的。

从这个意义上说,两阶段提交和事务的原因是,如果出现问题,您可以修复它(或者至少有 99.99% 的机会没有发生损坏)

问题findAndModify在于它没有这样的事务行为,不仅如此,MongoDB 仅在单个文档级别提供原子状态,这意味着,在同一个调用中,如果您的函数更改多个文档,您实际上可能会有一个不一致的 in-数据库数据中的状态之间。当然,这不适用于资金处理。

值得注意的是,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 非常适合这一点。

于 2013-05-04T12:06:43.100 回答