使用Spring Data進行MongoDB事務處理_第1頁
使用Spring Data進行MongoDB事務處理_第2頁
使用Spring Data進行MongoDB事務處理_第3頁
使用Spring Data進行MongoDB事務處理_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 使用Spring Data進行MongoDB事務處理在 HYPERLINK /transactions MongoDB 4.0 中,ACID 事務已經用于 Document 的存儲,強制維護全執行或全不執行的數據一致性狀態。所以讓我們直接在 synchronous 模型和 reactive 執行模型中驗證該特性。在撰寫本文時,MongoDB 的多文檔事務在單副本集中受支持,并且給用戶的感受像是在使用關系型數據庫的事務一樣。看到驅動程序提供的 API 立刻會感覺到回到家里一樣。try (ClientSession session = client.startSession() session.

2、startTransaction();try collection.insertOne(session, documentOne); collection.insertOne(session, documentTwo); mitTransaction(); catch (Exception e) session.abortTransaction();邏輯會話建立在 MongoDB的基礎上,當然,事務,當然還有事務構建了基礎。邏輯會話通過幫助跨分布式節點協調操作來為MangoDB的 HYPERLINK /manual/core/read-isolation-consistency-recency

3、/ l causal-consistency 因果一致性和事務建立基礎。客戶端從 client.startSession() 中獲取會話,會話的生命周期不應過長,在不再使用的時候應該立刻關閉它。所以確保使用 close() 來關閉客戶端會話。在底層的協議層,上面的代碼片段將會轉變為如下一系列命令,你可以清楚的發現在每個命令中都包含會話( lsid )。 startTransaction 標志位將會與第一個命令一起發送,表示事務的開始。在事務完成后, 發送 commitTransaction 表示事務的提交。 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 隨著即將發布的 Spring Data HYPERLINK /spring-projects/spring-data-commons/wiki/Release-Train-Lovelace Lovelace 版本,MongoDB 模塊將提供對 synchronous 和 reactive 事務的支持。 HYPERLINK https:/docs.spring.io/spring/docs/current/spring-framework-reference/data-access.html l transaction 我們從 synchronou

6、s 模式開始,你可以能已經非常熟悉 Spring 框架對事務的支持 (Spring Frameworks transaction support) 。因此,一個 MongoTransactionManager 的存在并不令人吃驚。該事務管理器是在命令式世界中基于注解的事務支持的入口。現在,因為 MongoDB 在早期版本中不支持事務,你必須明確的在 ApplicationContext 中注冊 MongoTransactionManager 。如果你這樣做的話, MongoTemplate 將會開始參與管理事務。這是一個你需要記住的要點。下面的例子展示了你應該如何配置事務管理器。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);非常直播的操作是吧?但是,這里有一些隱含的缺點。 HYPERLINK /manual/sharding/ l sharded-cluster h 集群環境下的事務支持在下一個 MongDB 的release 主要版本中才會支持,因此在您使用時會發生錯誤。此外,作為一個 MongoDB 的用戶,你可能已經習慣了他提供的所有的便利,但一些特性在事務中無法使用了,包括了幾

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

10、動程序 提供了一個反應切入點多文檔交易。將本機驅動程序管道 Publisher 化為 HYPERLINK https:/projectreactor.io/ Reactor 類型可讓您表達事務用法,如下所示: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(););不管事務的結果是成功還是回滾,我們都需要保證事務的終止。因此, onErrorResume(.) 保證了事務在失敗的時候可以回滾,然后在 flatMap(.) 中提交,這兩個階段都保存了主流 (main flow) 的結果或錯誤。 不同于 sync 部分,截

12、止撰稿時還沒有 reactive 模型可用的事務管理器能夠讓你通過注解 Transactional 那樣簡單的完成事務工作。 相反,你需要通過 ReactiveMongoTemplate.inTransaction(.)獲取一個 transaction 閉包。它在保持主流 (main flow) 結果的同事負責所有必需的會話,提交和終止操作。回調方法中的操作在MongoDB事務中執行,而外部的處理步驟將不會影響事務。這意味著閉包之外的處理錯誤不會導致事務終止,就像下面的例子描述的那樣。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);在這個例子中,你能夠通過流訪問到 ClientSession ,它存放在 Reactor 的 Context 中,并且你可以通過 ReactiveMongoContext.getSession() 來獲取它。 HYPERLINK /spring-projects/spring-data-examples 最后一件事情:我們非常高興你能夠嘗試并且給我們提供一些反饋,所以請查看 Spring Data Examples,您可以在其中找到相關的 HYPERLINK /spring-projects/spring-data-examples/tree/master/mongodb/transactions 項目 HYPERLINK /spring-projects/

溫馨提示

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

評論

0/150

提交評論