原子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
}
非常感谢。
我不知道这是你在找什么:
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/ 但我不会推荐你使用这个,因为一个单一的查询(转移资金)已被转化为查询序列。
希望它帮助
谢谢,这只是一个我想用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对此非常好。
非常感谢,对我很有帮助。 – user2349279 2013-05-04 19:35:27
您的第二个建议是要求单个银行的所有银行帐户都适合单个16MB BSON文档。如果没有交易,您将无法安全地跨银行或文件转账。此外,银行文件上会有很多争论。与其他交易型RDBMS选项相比,MongoDb不适合用于银行账户。 – WiredPrairie 2013-05-04 12:00:30
非常感谢你 – user2349279 2013-05-04 13:30:48
嗨WiredPrairie,我有一个问题,当用户A在后来的设计中向用户B转账资金时,文档被锁定,其他用户无法执行交易?谢谢。 – user2349279 2013-05-05 07:48:46