使用Spring Data進(jìn)行MongoDB事務(wù)處理_第1頁
使用Spring Data進(jìn)行MongoDB事務(wù)處理_第2頁
使用Spring Data進(jìn)行MongoDB事務(wù)處理_第3頁
使用Spring Data進(jìn)行MongoDB事務(wù)處理_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 使用Spring Data進(jìn)行MongoDB事務(wù)處理在 HYPERLINK /transactions MongoDB 4.0 中,ACID 事務(wù)已經(jīng)用于 Document 的存儲(chǔ),強(qiáng)制維護(hù)全執(zhí)行或全不執(zhí)行的數(shù)據(jù)一致性狀態(tài)。所以讓我們直接在 synchronous 模型和 reactive 執(zhí)行模型中驗(yàn)證該特性。在撰寫本文時(shí),MongoDB 的多文檔事務(wù)在單副本集中受支持,并且給用戶的感受像是在使用關(guān)系型數(shù)據(jù)庫的事務(wù)一樣??吹津?qū)動(dòng)程序提供的 API 立刻會(huì)感覺到回到家里一樣。try (ClientSession session = client.startSession() session.

2、startTransaction();try collection.insertOne(session, documentOne); collection.insertOne(session, documentTwo); mitTransaction(); catch (Exception e) session.abortTransaction();邏輯會(huì)話建立在 MongoDB的基礎(chǔ)上,當(dāng)然,事務(wù),當(dāng)然還有事務(wù)構(gòu)建了基礎(chǔ)。邏輯會(huì)話通過幫助跨分布式節(jié)點(diǎn)協(xié)調(diào)操作來為MangoDB的 HYPERLINK /manual/core/read-isolation-consistency-recency

3、/ l causal-consistency 因果一致性和事務(wù)建立基礎(chǔ)??蛻舳藦?client.startSession() 中獲取會(huì)話,會(huì)話的生命周期不應(yīng)過長,在不再使用的時(shí)候應(yīng)該立刻關(guān)閉它。所以確保使用 close() 來關(guān)閉客戶端會(huì)話。在底層的協(xié)議層,上面的代碼片段將會(huì)轉(zhuǎn)變?yōu)槿缦乱幌盗忻?,你可以清楚的發(fā)現(xiàn)在每個(gè)命令中都包含會(huì)話( lsid )。 startTransaction 標(biāo)志位將會(huì)與第一個(gè)命令一起發(fā)送,表示事務(wù)的開始。在事務(wù)完成后, 發(fā)送 commitTransaction 表示事務(wù)的提交。 insert: col, ordered: true, $db: db,$cluste

4、rTime: ,lsid: id: $binary: base64 : I3M7Nj, , txnNumber: 1,startTransaction: true, documents: insert: col, ordered: true, $db: db,$clusterTime: ,lsid: id: $binary: base64 : I3M7Nj, , txnNumber: 1,autocommit: false, documents: commitTransaction: 1,$db: admin,$clusterTime: ,lsid: id: $binary: base64 :

5、 I3M7Nj, , txnNumber: 1 隨著即將發(fā)布的 Spring Data HYPERLINK /spring-projects/spring-data-commons/wiki/Release-Train-Lovelace Lovelace 版本,MongoDB 模塊將提供對 synchronous 和 reactive 事務(wù)的支持。 HYPERLINK https:/docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html l transaction 我們從 synchronou

6、s 模式開始,你可以能已經(jīng)非常熟悉 Spring 框架對事務(wù)的支持 (Spring Frameworks transaction support) 。因此,一個(gè) MongoTransactionManager 的存在并不令人吃驚。該事務(wù)管理器是在命令式世界中基于注解的事務(wù)支持的入口?,F(xiàn)在,因?yàn)?MongoDB 在早期版本中不支持事務(wù),你必須明確的在 ApplicationContext 中注冊 MongoTransactionManager 。如果你這樣做的話, MongoTemplate 將會(huì)開始參與管理事務(wù)。這是一個(gè)你需要記住的要點(diǎn)。下面的例子展示了你應(yīng)該如何配置事務(wù)管理器。Configu

7、rationclass Config extends AbstractMongoConfiguration BeanMongoTransactionManager transactionManager(MongoDbFactory dbFactory) return new MongoTransactionManager(dbFactory);Serviceclass DocumentService private final MongoOperations operations; DocumentService(MongoOperations operations) this.operati

8、ons = operations;Transactionalvoid insertDocuments() operations.insert(documentOne); operations.insert(documentTwo);非常直播的操作是吧?但是,這里有一些隱含的缺點(diǎn)。 HYPERLINK /manual/sharding/ l sharded-cluster h 集群環(huán)境下的事務(wù)支持在下一個(gè) MongDB 的release 主要版本中才會(huì)支持,因此在您使用時(shí)會(huì)發(fā)生錯(cuò)誤。此外,作為一個(gè) MongoDB 的用戶,你可能已經(jīng)習(xí)慣了他提供的所有的便利,但一些特性在事務(wù)中無法使用了,包括了幾

9、乎所有的元命令,創(chuàng)建集合,索引以及受此使用集合時(shí)隱式創(chuàng)建集合。為了避免錯(cuò)誤和折騰,請務(wù)必設(shè)置所需的結(jié)構(gòu)。此外, 某些命令可能還會(huì)有一些不同。例如使用集合集合統(tǒng)計(jì)信息的 count 命令可能在事務(wù)中并不準(zhǔn)確。命令將會(huì)出錯(cuò)并且需要使用聚合計(jì)數(shù)文檔,當(dāng)前的驅(qū)動(dòng)已經(jīng)提供一個(gè)替代方法 countDocuments 來利用聚合策略解決這個(gè)問題。考慮到這一點(diǎn),讓我們繼續(xù)進(jìn)行 reactive 使用的部分。 PAGE 6在 HYPERLINK https:/mongodb.github.io/mongo-java-driver-reactivestreams/ MongoDB的ReactiveStreams驅(qū)

10、動(dòng)程序 提供了一個(gè)反應(yīng)切入點(diǎn)多文檔交易。將本機(jī)驅(qū)動(dòng)程序管道 Publisher 化為 HYPERLINK https:/projectreactor.io/ Reactor 類型可讓您表達(dá)事務(wù)用法,如下所示:Mono.from(client.startSession().flatMap(session - session.startTransaction();return Mono.from(collection.insertOne(session, documentOne).then(Mono.from(collection.insertOne(session, documentTwo).o

11、nErrorResume(e - Mono.from(session.abortTransaction().then(Mono.error(e).flatMap(val - Mono.from(mitTransaction().then(Mono.just(val).doFinally(signal - session.close(););不管事務(wù)的結(jié)果是成功還是回滾,我們都需要保證事務(wù)的終止。因此, onErrorResume(.) 保證了事務(wù)在失敗的時(shí)候可以回滾,然后在 flatMap(.) 中提交,這兩個(gè)階段都保存了主流 (main flow) 的結(jié)果或錯(cuò)誤。 不同于 sync 部分,截

12、止撰稿時(shí)還沒有 reactive 模型可用的事務(wù)管理器能夠讓你通過注解 Transactional 那樣簡單的完成事務(wù)工作。 相反,你需要通過 ReactiveMongoTemplate.inTransaction(.)獲取一個(gè) transaction 閉包。它在保持主流 (main flow) 結(jié)果的同事負(fù)責(zé)所有必需的會(huì)話,提交和終止操作?;卣{(diào)方法中的操作在MongoDB事務(wù)中執(zhí)行,而外部的處理步驟將不會(huì)影響事務(wù)。這意味著閉包之外的處理錯(cuò)誤不會(huì)導(dǎo)致事務(wù)終止,就像下面的例子描述的那樣。template.inTransaction().execute(action -/ All code in

13、here runs inside the transaction action.insert(documentOne).then(action.insert(documentTwo).flatMap(val - / An exception here does not affect the transaction);在這個(gè)例子中,你能夠通過流訪問到 ClientSession ,它存放在 Reactor 的 Context 中,并且你可以通過 ReactiveMongoContext.getSession() 來獲取它。 HYPERLINK /spring-projects/spring-data-examples 最后一件事情:我們非常高興你能夠嘗試并且給我們提供一些反饋,所以請查看 Spring Data Examples,您可以在其中找到相關(guān)的 HYPERLINK /spring-projects/spring-data-examples/tree/master/mongodb/transactions 項(xiàng)目 HYPERLINK /spring-projects/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論