mongodb是nosql数据库吗 12 NoSQL | MongoDB入门实战教程


mongodb是nosql数据库吗 12 NoSQL | MongoDB入门实战教程

文章插图
MongoDB
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来进行一个多文档操作的事务提交:
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中的实践
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 loggingclientSession.AbortTransaction();}}在Java Driver中的实践
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版本开始全面支持多文档事务,但是并不代表我们可以毫无节制地使用它 。相反,对事务的使用原则应该是:能不用尽量不用!


以上关于本文的内容,仅作参考!温馨提示:如遇健康、疾病相关的问题,请您及时就医或请专业人士给予相关指导!

「四川龙网」www.sichuanlong.com小编还为您精选了以下内容,希望对您有所帮助: