使用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

提交评论