Mongodb支持事务吗?

一、概念

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();
}

相关推荐

  1. MongoDB 中的事务

    2024-04-23 07:14:02       50 阅读
  2. Spring Boot整合MongoDB实现事务管理

    2024-04-23 07:14:02       29 阅读
  3. 多数据源 - dynamic-datasource | 事务支持

    2024-04-23 07:14:02       44 阅读
  4. 速盾:cdn 支持php

    2024-04-23 07:14:02       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-23 07:14:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-23 07:14:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-23 07:14:02       87 阅读
  4. Python语言-面向对象

    2024-04-23 07:14:02       96 阅读

热门阅读

  1. C++笔记打卡第15天(函数模版)

    2024-04-23 07:14:02       39 阅读
  2. Python网络爬虫项目开发实战:怎么解决数据抓取

    2024-04-23 07:14:02       34 阅读
  3. 蓝桥杯 BASIC-22 基础练习 FJ的字符串

    2024-04-23 07:14:02       33 阅读
  4. go语言学习

    2024-04-23 07:14:02       32 阅读
  5. Golang net/http 标准库源码学习

    2024-04-23 07:14:02       30 阅读
  6. 【嵌入式学习】ARM day04.16

    2024-04-23 07:14:02       40 阅读
  7. c++计算DNA探针的熔解温度

    2024-04-23 07:14:02       37 阅读
  8. MapReduce——数据切片与MapTask并行度决定机制

    2024-04-23 07:14:02       36 阅读
  9. 代码随想录:链表

    2024-04-23 07:14:02       40 阅读
  10. 分发糖果——使用贪心算法

    2024-04-23 07:14:02       35 阅读
  11. CentOS 7 上安装 MySQL 8.0详细步骤

    2024-04-23 07:14:02       42 阅读
  12. 前端需要知道的知识点,附有链接

    2024-04-23 07:14:02       38 阅读
  13. FPGA ——Verilog语法示例

    2024-04-23 07:14:02       30 阅读