热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB 事务支持详解_MongoDB

这篇文章主要介绍了MongoDB 事务支持详解的相关资料,

事务简介

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

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 文档大小限制之内。


推荐阅读
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
author-avatar
一个人跳舞__的绣绣
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有