一、概念
1.1、MongoDB业务简介
MongoDB 是一个非联系型数据库管理系统,开始并不支撑业务。然而,跟着时间的推移,MongoDB 在其4.0版本中引入了多文档业务支撑,使得在单个调集中履行多个操作成为可能。
In MongoDB, an operation on a single document is atomic. Because you can use embedded documents and arrays to capture relationships between data in a single document structure instead of normalizing across multiple documents and collections, this single-document atomicity obviates the need for distributed transactions for many practical use cases.
For situations that require atomicity of reads and writes to multiple documents (in a single or multiple collections), MongoDB supports distributed transactions. With distributed transactions, transactions can be used across multiple operations, collections, databases, documents, and shards.
译文:
在MongoDB中,对单个文档的操作是原子的。因为您可以运用嵌入式文档和数组来捕获单个文档结构中的数据之间的联系,而不是在多个文档和调集之间进行规范化,所以这种单文档原子性消除了许多实际用例中对多文档业务的需求。
关于需要原子性地读写多个文档(在单个或多个调集中)的状况,MongoDB支撑多文档业务。运用分布式业务,可以跨多个操作,调集,数据库,文档和分片运用业务。
1.2、业务和原子性
在MongoDB中,对单个文档的操作是原子的。从MongoDB 4.2开始,分布式业务和多文档业务是同义词。 分布式业务是指分片群集和副本集上的多文档业务。 从MongoDB 4.2开始,多文档业务(无论是在分片群集或副本集上)也称为分布式业务。
二、具体操作
2.1、装备业务
在测验mongodb之前要先装备一下业务,MongoDB 的业务只能在开启副本集的时候才能运用,一般安装后默许是单副本,我们装备将其装备成多副本后再运行业务。否则的话会报以下过错。↓↓↓
MongoServerError: Transaction numbers are only allowed on a replica set member or mongos
step1:
vim /usr/local/mongodb/mongodb.conf
在最后边增加
replication:
replSetName: rs0
step2:
保存后重启mongodb,然后进入履行
/usr/local/mongodb/bin/mongo
step3:
rs.initiate()
到这里就成功后,后边就可以去测验业务了。
2.2、业务示例
1)多文档业务支撑(Multi-document Transactions)
多文档业务允许在一个业务中对多个文档履行读写操作,跨越多个调集或单个调集的多个文档。这保证了这些操作要么悉数成功提交,要么悉数失利回滚,然后坚持数据的一致性。
示例命令行业务示例(运用 MongoDB Shell):
// 开启一个会话
session = db.getMongo().startSession();
//创立两个调集
coll1 = session.getDatabase("mydb1").collection1;
coll2 = session.getDatabase("mydb1").collection2;
// 在会话中启动业务
session.startTransaction();
try {
coll1.insertOne({ id: 1 ,name:"001"});
coll2.insertOne({ id: 2, name: "002" });
// 假如一切顺利,提交业务
session.commitTransaction();
} catch (error) {
// 产生过错时,回滚业务
session.abortTransaction();
}
在多文档业务中支撑以下读/写操作: |
2)回滚与提交(Rollback and Commit)
假如业务中的任何操作失利,整个业务将被回滚,之前所做的修正都不会被应用到数据库中。只有当一切操作都成功完结时,业务才会被提交并应用到数据库中。
示例:
// 开启一个会话
session = db.getMongo().startSession();
//创立两个调集
coll1 = session.getDatabase("mydb1").collection1;
coll2 = session.getDatabase("mydb1").collection2;
// 在会话中启动业务
session.startTransaction();
try {
coll1.insertOne({ id: 1 ,name:"001"});
coll2.insertOne({ id: 2, name: "002" });
//模仿一个过错
throw "Some error occurred";
// 假如一切顺利,提交业务
session.commitTransaction();
} catch (error) {
// 产生过错时,回滚业务
session.abortTransaction();
}