领先一步
VMware 提供培训和认证,助您加速进步。
了解更多随着最新的 Spring Data Lovelace Milestone 2 发布,MongoDB 模块正在堆积大量新功能,这些功能将在不久的将来为您带来。正如您可能从新闻中了解到的,MongoDB 4 将为文档存储带来 ACID 事务。最新的 MongoDB 3.6 服务器版本已经附带了这些功能的主要构建块,即客户端会话。
您可以在 MongoDB 参考文档中阅读有关隔离级别和因果一致性的所有信息。简而言之,会话允许您按尊重因果关系的顺序执行操作。
使用 Spring Data MongoDB,无论是命令式还是响应式编程,ClientSession 都近在咫尺,因为它已集成到现有的 MongoOperations 和 ReactiveMongoOperations 中。为了提供最大的控制力和足够的便利性,ClientSession 的生命周期管理由您负责,而模板会负责将 session 正确地传递给驱动程序。以下示例演示了如何创建 ClientSession
ClientSessionOptions sessionOptions = ClientSessionOptions.builder()
.causallyConsistent(true)
.build();
ClientSession session = client.startSession(sessionOptions);
一旦从 MongoDB Java Driver 获取了 session,您只需将其添加到模板中即可检索 session 绑定的操作,并在完成后 close() 该 session,如下例所示
MongoOperations sessionBound = template.withSession(session);
Query query = query(where("name").is("Durzo Blint")
Person durzo = sessionBound.findOne(query), Person.class);
Person kylar = new Person("Kylar Stern");
kylar.setMaster(durzo);
sessionBound.insert(kylar);
session.close();
使用响应式编程模型,上述示例看起来会有些不同,因为我们将获取一个 session Publisher,并希望确保在实际订阅之前不要解析它。因此,我们不会获取一个 session 作用域的 ReactiveMongoTemplate,而是获取一个 ReactiveSessionScoped 实例,该实例持有对 session Publisher 的引用,并提供执行和关闭句柄,以便我们能够确保在返回的 Flux 的 finally 块中关闭 ClientSession,如下例所示
ClientSessionOptions sessionOptions = ClientSessionOptions.builder()
.causallyConsistent(true)
.build();
// obtain a session, but do not subscribe to it
Publisher<ClientSession> session = client.startSession(sessionOptions);
template.withSession(session)
.execute(action -> {
Query query = query(where("name").is("Durzo Blint"));
return action.findOne(query, Person.class)
.flatMap(durzo -> {
Person kylar = new Person("Kylar Stern");
kylar.setMaster(durzo);
return action.insert(kylar);
});
}, ClientSession::close) // make sure we close the session when finished
.subscribe();
到目前为止,一切顺利,但我们在本文开头没有提到事务吗?
是的,事务将成为 MongoDB 4.0 的一部分,是的,我们将为此做好准备。如果您想关注我们在事务支持方面的努力,请务必 关注开发进展。以下是您可期待内容的一瞥。
MongoTransactionManager 将是通往广为人知的事务支持的门户,它允许应用程序使用 Spring 的 托管事务 功能。MongoTransactionManager 将创建并将 ClientSession 绑定到线程。事务将被启动、提交或中止,而 MongoTemplate 会自动检测现有的 ClientSession 并相应地对其进行操作,如下例所示
@Configuration
public class Config extends AbstractMongoConfiguration {
@Bean
MongoTransactionManager transactionManager(MongoDbFactory dbFactory) {
return new MongoTransactionManager(dbFactory);
}
// ...
}
@Service
public class NightAngel {
@Autowired PersonRepository repository;
@Transactional
public void trainAzoth() {
Person durzo = repository.findByName("Durzo Blint");
Person kylar = new Person("Kylar Stern");
kylar.setMaster(durzo);
repository.save(kylar);
}
}