2013-05-04 67 views
2

我是新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

回答

2

我不知道這是你在找什麼:

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

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可以採取安全預防措施以確保數據在一直。

所以回到你的最後一個問題:命名Transaction_money到

一些pepple告訴我,使用MySQL這個項目是最好的方式,而僅僅只用MongoDB中保存交易信息(使用額外的收集保存),如果我使用的MongoDB和MySQL都(InnoDB的)如何才能讓下面的一些操作是原子的(失敗或成功全):

我想說的東西比MySQL更強大的一點個人而言,我聽到MSSQL對此非常好。

+0

非常感謝,對我很有幫助。 – user2349279 2013-05-04 19:35:27