MongoDB 事务支持详解

目录
  • 事务简介
  • 如何使用事务
    • 事务语法
    • API 区别
    • 实际使用
  • 事务调优
    • 时间限制
    • oplog 大小限制

事务简介

事务是数据库中处理的逻辑单元,每个事务中包括一个或多个数据库操作,既可以是读操作,也可以是写操作。

ACID 是一个“真正”事务所需要具备的一组属性集合,指的是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。

原子性指的是,事务中的所有操作要么都被应用,要么都不被应用。

一致性指的是,如果数据库在执行事务之前是一致性状态,那么在事务执行之后,无论事务是否成功,数据库也应该是一致性状态。

隔离性指的是,即使数据库中有多个事务并发地执行,各个事务之间也不会互相影响,并且在并发状态下执行的事务和串行执行的事务产生的结果完全相同。

持久性指的是,在事务成功提交了之后,事务所变更的数据一定会保存起来,而不会因为任何故障导致数据丢失。

当数据库满足所有这些属性,并且只有成功的事务才会被处理时,它就被称为是符合 ACID 的数据库。

如何使用事务

事务语法

MongoDB 提供了两种 API 来使用事务:

  • 核心 API,与关系数据库类似的语法(如 start_transaction 和 commit_transaction
  • 回调 API,这是使用事务的推荐方法

核心 API 不为大多数错误提供重试逻辑,它要求开发人员为操作、事务提交函数以及所需的任何重试和错误逻辑手动编写代码。

与核心 API 不同,回调 API 提供了一个单独的函数,该函数封装了大量功能,包括启动与指定逻辑会话关联的事务、执行作为回调函数提供的函数以及提交事务(或在出现错误时中止)。此函数还包含了处理提交错误的重试逻辑。

在 MongoDB 4.2 中添加回调 API 是为了简化使用事务的应用程序开发,也便于添加处理事务错误的应用程序重试逻辑。

API 区别

核心 API 回调 API
需要显式调用才能启动和提交事务 启动事务、执行指定的操作,然后提交(或在发生错误时终止)
不包含 TransientTransactionError 和 UnknownTransactionCommitResult 的错误处理逻辑,而是提供了为这些错误进行自定义处理的灵活性 自动为 TransientTransactionError 和 UnknownTransactionCommitResult 提供错误处理逻辑
要求为特定事务将显式的逻辑会话传递给 API 要求为特定事务将显式的逻辑会话传递给 API

实际使用

在一个 Python 的例子当中,使用核心 API 的伪代码如下展示:

from pymongo import MongoClient
from pymongo.errors import ConnectionFailure, OperationFailure

# 显式开启一个事务会话
with client.start_session() as session:
    while True:
        try:
            with session.start_transaction():
                # 执行事务中的多个写操作
                pass
                # 提交事务
                session.commit_transaction()
        except (ConnectionFailure, OperationFailure) as e:
            # 错误处理
            if e.has_error_label("UnknownTransactionCommitResult"):
                # 出现暂时性错误,则重试整个事务
                continue
            else:
                raise

使用核心 API 需要注意错误的捕捉和处理,而回调 API 就不需要注意这些,其伪代码如下展示:

from pymongo import MongoClient

def session_callback(session):
    # 执行事务中的多个写操作
    pass

# 显式开启一个事务会话
with client.start_session() as session:
    session.with_transaction(session_callback)

事务调优

在使用事务时,有几个重要的参数需要注意。可以对它们进行调整,以确保应用程序能够最佳地使用事务。

在 MongoDB 事务中有两类主要的限制:

  • 第一类与事务的时间限制有关,控制特定事务可以运行多长时间、事务等待获取锁的时间以及所有事务将运行的最大长度
  • 第二类与 MongoDB 的 oplog 条目和单个条目的大小限制有关

时间限制

事务的默认最大运行时间是 1 分钟。

可以通过在 mongod 实例级别上修改 transactionLifetimeLimitSeconds 的限制来增加。对于分片集群,必须在所有分片副本集成员上设置该参数。超过此时间后,事务将被视为已过期,并由定期运行的清理进程中止。清理进程每 60 秒或每 transactionLifetimeLimitSeconds/2 运行一次,以较小的值为准。

要显式设置事务的时间限制,建议在提交事务时指定 maxTimeMS 参数。实际上会使用 maxTimeMS 和 transactionLifetimeLimitSeconds 中的更小值。

事务等待获取其操作所需锁的默认最大时间是 5 毫秒。可以通过修改由 maxTransactionLockRequestTimeoutMillis 参数控制的限制来增加。如果事务在此期间无法获得锁,则该事务会被中止。

当 maxTransactionLockRequestTimeoutMillis 设置为 0 时,意味着如果事务无法立即获得所需的所有锁,则该事务会被中止。设置为 -1 将使用由 maxTimeMS 参数所指定的特定于操作的超时时间。

oplog 大小限制

MongoDB 会创建出与事务中写操作数量相同的 oplog 条目。

但是,每个 oplog 条目必须在 16MB 的 BSON 文档大小限制之内。

到此这篇关于MongoDB 事务支持详解的文章就介绍到这了,更多相关MongoDB事务支持内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MongoDB数据库两阶段提交实现事务的方法详解

    本文实例讲述了MongoDB数据库两阶段提交实现事务的方法.分享给大家供大家参考,具体如下: MongoDB数据库中操作单个文档总是原子性的,然而,涉及多个文档的操作,通常被作为一个"事务",而不是原子性的.因为文档可以是相当复杂并且包含多个嵌套文档,单文档的原子性对许多实际用例提供了支持.尽管单文档操作是原子性的,在某些情况下,需要多文档事务.在这些情况下,使用两阶段提交,提供这些类型的多文档更新支持.因为文档可以表示为Pending数据和状态,可以使用一个两阶段提交确保数据是一致的

  • SpringDataMongoDB多文档事务的实现

    一.安装MongoDB4.0.3(××) 1.1.官方安装文档 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 1.2.tar.gz包下载地址 https://www.mongodb.com/download-center/community?jmp=docs 1.3.复制集官方配置 https://docs.mongodb.com/manual/administration/replica-set-mem

  • mongoDB 4.0事务回滚的辛酸历程探究

    前言 主管前几天发现mongoDB已经升级到4.0了,迫不及待得让我实现他期待已久的事务回滚,发现还是有很多坑啊! 下面是我将已有的本地mongoDB升级到支持事务回滚的历程,分享出来,有错误的地方欢迎指正! 以mac为例哈 部署mongodb事务回滚 1.准备工作 升级mongodb至4.0.0 $ brew upgrade mongodb 升级或安装mongodb.js v3.1.0 以上 $ npm i mongodb --save-dev 坑 升级完上述后,db.js里连接mongo时,

  • MongoDB 事务支持详解

    目录 事务简介 如何使用事务 事务语法 API 区别 实际使用 事务调优 时间限制 oplog 大小限制 事务简介 事务是数据库中处理的逻辑单元,每个事务中包括一个或多个数据库操作,既可以是读操作,也可以是写操作. ACID 是一个“真正”事务所需要具备的一组属性集合,指的是原子性(Atomicity).一致性(Consistency).隔离性(Isolation)和持久性(Durability). 原子性指的是,事务中的所有操作要么都被应用,要么都不被应用. 一致性指的是,如果数据库在执行事务

  • mysql的存储过程、游标 、事务实例详解

    mysql的存储过程.游标 .事务实例详解 下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: DELIMITER $$ DROP PROCEDURE IF EXISTS `transferEmailTempData`$$ CREATE PROCEDURE transferEmailTempData(IN jobId VARCHAR(24)) BEG

  • JSP 中spring事务配置详解

    JSP 中spring事务配置详解 前几天被问到,如何防止服务器宕机,造成的数据操作的不完全. 问了一下同事,是事务.哎,恍然大悟,迷糊一时了. 声明式的事务配置,这个是最推荐的,配置到service层. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context=&

  • PHP7之Mongodb API使用详解

    编译安装PHP7 编译安装PHP7 Mongdb扩展 #先安装一个依赖库yum -y install openldap-develwget https://pecl.php.net/get/mongodb-1.1.1.tgz /home/server/php7/bin/phpize   #根据自己编译的PHP环境而定./configure --with-php-config=/home/server/php7/bin/php-config make && make install#如果成功

  • Laravel框架中集成MongoDB和使用详解

    * 推荐组件 composer require jenssegers/mongodb ^3.3 -vvv(本人的laravel版本是5.5) 修改config/app.php * 注册服务 Jenssegers\Mongodb\MongodbServiceProvider::class, * 添加 Facades 'Mongo' => Jenssegers\Mongodb\MongodbServiceProvider::class, * 修改数据库配置文件 config/database.php

  • Spring Boot事务配置详解

    1.在启动主类添加注解:@EnableTransactionManagement 来启用注解式事务管理,相当于之前在xml中配置的<tx:annotation-driven />注解驱动. 2.在需要事务的类或者方法上面添加@Transactional() 注解,里面可以配置需要的粒度: 这么多东西提供配置: Isolation :隔离级别 隔离级别是指若干个并发的事务之间的隔离程度,与我们开发时候主要相关的场景包括:脏读取.重复读.幻读. 我们可以看 org.springframework.

  • LCN分布式事务解决方案详解

    目录 一.什么是分布式事务? 二.lcn的实现思路 2.1 本地执行的状态怎么提交给全局事务? 2.2 本地事务的提交或回滚怎么实现? 三.lcn的使用 3.1 下载lcn-manager (全局的事务管理器) 3.2 配置lcn-manager 3.3 启动lcn 3.4 模拟转账服务 3.4.1 add-service 3.4.2 decr-service 3.5 2 个微服务都需要添加依赖 3.6 需要自定义数据库的连接池 3.7 使用 3.7.1 事务的发起者 3.7.2 添加配置文件

  • Java连接MongoDB的常用方法详解

    目录 一.Java链接MongoDB 二.查看库,查看集合 三.Java对MongoDB增删改查 1. 添加数据 2. 删除数据 3. 修改数据 4. 查询数据 一.Java链接MongoDB 1. 导入Mongo驱动包 2. 获取Mongo链接对象 MongoClient mc = new MongoClient("localhost",27017); 3. 关闭链接 mc.close(); 二.查看库,查看集合 1. 获取库对象 MongoDatabase db = mc.getD

  • Python操作MongoDB的教程详解(插,查,改,排,删)

    目录 插入文档 插入集合 返回 _id 字段 插入多个文档 插入指定 _id 的多个文档 查询文档 查询一条数据 查询集合中所有数据 查询指定字段的数据 根据指定条件查询 高级查询 返回指定条数记录 修改文档 排序 删除数据 删除多个文档 删除集合中的所有文档 删除集合 MongoDB 是一个基于分布式文件存储的数据库.是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(

  • SpringCloud微服务开发基于RocketMQ实现分布式事务管理详解

    目录 消息队列实现分布式事务原理 RocketMQ的事务消息 代码实现 基础配置 发送半消息 执行本地事务与回查 Account-Service消费消息 测试 小结 消息队列实现分布式事务原理 首先让我们来看一下基于消息队列实现分布式事务的原理方案. 柔性事务 发送消息的服务有个OUTBOX数据表,在进行INSERT.UPDATE.DELETE 业务操作时也会给OUTBOX数据表INSERT一条消息记录,这样可以保证原子性,因为这是基于本地的ACID事务. OUTBOX表充当临时消息队列,然后我

随机推荐