前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB入门实战教程(12)

MongoDB入门实战教程(12)

作者头像
Edison Zhou
发布2021-07-14 13:50:44
3740
发布2021-07-14 13:50:44
举报
文章被收录于专栏:EdisonTalkEdisonTalk

MongoDB在4.2版本开始全面支持了多文档事务,这也让MongoDB可以作为OLTP的选项之一,本篇我们就来学习一下MongoDB的多文档事务。

1 ACID支持程度

谈到事务,就不得不提经典的ACID特性,MongoDB对ACID的支持程度到底如何呢?且看下表:

事务属性

支持程度

Atomocity 原子性

单表单文档:1.x 就开始支持复制集多表多行:4.0 开始支持分片集多表多行:4.2 开始支持

Consistency 一致性

writeConcern, readConcern

Isolation 隔离性

readConcern

Durability 持久性

Journal and Replication

2 多文档事务使用方法

基本使用方式

MongoDB多文档事务的使用方式与关系型数据库基本类似。

但是需要注意的是:多文档事务只能应用在副本集 或 mongos 节点上。如果你只是一个单点的mongo实例,是无法进行多文档事务实践的。

如何搭建一个mongodb的复制集?参考《MongoDB入门实战教程(2)

在Mongo Shell中的实践

下面演示了如何通过Mongo Shell来进行一个多文档操作的事务提交:

代码语言:javascript
复制
var session = db.getMongo().startSession();
session.startTransaction({readConcern: { level: 'majority' },writeConcern: { w: 'majority' }});

var coll1 = session.getDatabase('students').getCollection('teams');
coll1.update({name: 'yzw-football-team'}, {$set: {members: 20}});

var coll2 = session.getDatabase('students').getCollection('records');
coll1.update({name: 'Edison'}, {$set: {gender: 'Female'}});

// 成功提交事务
session.commitTransaction();

// 失败事务回滚
session.abortTransaction();

在.NET Driver中的实践

代码语言:javascript
复制
using (var clientSession = mongoClient.StartSession())
{
    try
    {
        var contacts = clientSession.Client.GetDatabase("testDB").GetCollection<Contact>("contacts");
        contacts.ReplaceOne(contact => contact.Id == "1234455", contact);
        var books = clientSession.Client.GetDatabase("testDB").GetCollection<Book>("books");
        books.DeleteOne(book => book.Id == "1234455");

        clientSession.CommitTransaction();
    }
    catch (Exception ex)
    {
        // to do some logging
        clientSession.AbortTransaction();
    }
}

在Java Driver中的实践

代码语言:javascript
复制
try (ClientSession clientSession = client.startSession()) {
  clientSession.startTransaction();
  collection.insertOne(clientSession, docOne);
  collection.insertOne(clientSession, docTwo);
  clientSession.commitTransaction();
}

扩展:事务的隔离级别

关于MongoDB的事务隔离级别,有以下亮点说明:

(1)默认情况下,在MongoDB的事务完成前,事务外的操作对该事务所做的修改是访问不到的

(2)如果我们在开启事务时设置 {readConcern: "snapshot"},则可以达到可重复读(Repeatable Read)的级别,这也是MySQL的默认事务隔离级别。而如果我们设置{readConcern: "majority"},则可以达到读提交(Read Commited)的级别,这是MSSQL的默认事务隔离级别。

3 注意事项

MongoDB可以实现和关系型数据库类似的事务场景,但在应用程序开发的时候必须使用与4.2及以上版本兼容的Driver。

事务默认必须在60s内完成,否则将被取消。当然,我们也可以调整这个默认值,但是建议不要超过60s。

多文档事务中的读操作必须使用主节点读取,这是为了保证事务的数据强一致性。

虽然,MongoDB在4.2版本开始全面支持多文档事务,但是并不代表我们可以毫无节制地使用它。相反,对事务的使用原则应该是:能不用尽量不用

通过合理地设计文档模型,其实可以规避绝大部分使用事务的必要性。

Why?因为 事务 = 锁,节点协调,额外开销,性能影响 ...

4 总结

本文简单介绍了MongoDB多文档事务的使用,它弥补了MongoDB无法实现传统关系型数据库ACID特性的不足。

下一篇,我们会学习MongoDB的分片集原理 及 分片策略。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-07-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 ACID支持程度
  • 2 多文档事务使用方法
    • 基本使用方式
      • 在Mongo Shell中的实践
        • 在.NET Driver中的实践
          • 在Java Driver中的实践
            • 扩展:事务的隔离级别
            • 3 注意事项
            • 4 总结
            相关产品与服务
            云数据库 MongoDB
            腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档