MongoDB – 事务支持

事务简介

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

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

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

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

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

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

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

如何使用事务

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

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

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

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

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

核心 API 回调 API 需要显式调用才能启动和提交事务 启动事务、执行指定的操作,然后提交(或在发生错误时终止) 不包含

的错误处理逻辑,而是提供了为这些错误进行自定义处理的灵活性 自动为

提供错误处理逻辑 要求为特定事务将显式的逻辑会话传递给 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 参数。实际上会使用 maxTimeMStransactionLifetimeLimitSeconds 中的更小值。

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

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

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

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

Original: https://www.cnblogs.com/fatedeity/p/16925314.html
Author: 程序员翔仔
Title: MongoDB – 事务支持

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/797879/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Asp.NetCore利用缓存使用AOP方式防止重复提交

    为什么要用? 有些时候经常会遇到重复提交的问题,为了避免这个问题,可以使用缓存锁的方式,主要是利用存取缓存比较快的原理。 当提交某个操作的时候,第一次提交会创建一个缓存,当有相同提…

    Python 2023年6月12日
    048
  • 华为云桌面,数字化时代便捷、安全的办公选择

    在当今效率优先、信息技术高度发展的时代,云桌面作为一种帮助企业实现快速办公上云的云服务,将应用于企业日常办公中,它不仅能够提升工作效率,而且还具有良好的扩展性和可扩展性,因此备受业…

    Python 2023年9月30日
    042
  • np.around()、np.floor()、np.ceil()、np.where()函数学习

    np.around(a, decimals=0, out=None) 参数解析:a: array_like,输入数据;decimals: int,指定保留小数点后的位数;out: …

    Python 2023年8月24日
    037
  • Linux系统安装并配置nginx实现多服务同一端口

    基本诉求是项目要实现并发,因为用了深度学习框架,tornado服务无法通过以下方式多进程开启服务, python;gutter:true; http_server.bind(por…

    Python 2023年10月28日
    022
  • 一阶段目标检测网络-RetinaNet详解

    文章首发于我的 github 仓库-cv算法工程师成长之路,欢迎关注我的公众号-嵌入式视觉。本人水平有限,文章如有问题,欢迎及时指出。如果看完文章有所收获,一定要先点赞后收藏。毕竟…

    Python 2023年10月29日
    024
  • 函数及闭包

    Python 2023年5月24日
    062
  • pandas 数据处理groupby apply针对的是所有列

    近期碰到一个需求,需要对数据分组然后 分组后的数据还要进行处理首先创建一个简单的dataframe df=pd.DataFrame({ ‘a’:[1,3,3,3,4],’b’: O…

    Python 2023年8月16日
    033
  • Flask之工厂模式

    Flask开发之–构建工厂模式(一) 提示:如果您学习了flask,想迫切开始自己的第一个项目,这里可以在一定程度上帮助你。 文章目录 Flask开发之–构建工厂模式(…

    Python 2023年8月14日
    035
  • 基于Python flask构建微信小程序订餐系统

    目 录摘 要 IAbstract II目 录 III1.绪论 11.1 课题背景 11.2 课题意义 11.3 论文结构 22.相关技术 32.1 系统开发环境 32.1.1系统开…

    Python 2023年8月9日
    052
  • 今日内容 Django连接MySQL操作及ORM基本操作

    *静态文件及相关配置 1.先编写一个登录功能 (1)创建django项目并创建一个app (2)在url.py添加一组对应关系 (3)在app的views.py中编写登录核心逻辑 …

    Python 2023年6月12日
    079
  • SimpleITK使用——2. 进行crop操作

    抵扣说明: 1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。 Original: https://blo…

    Python 2023年8月27日
    036
  • Z 字形变换

    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:…

    Python 2023年6月10日
    0111
  • 上线flask记录

    pip3 install virtualenv cd /data/ops virtualenv -p /usr/bin/python3 backstage source backs…

    Python 2023年8月11日
    052
  • Pytest自动化测试 – 完美结合Allure

    简介 Allure Framework是一种灵活的、轻量级、多语言测试报告工具。 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容, 而且还允许参与开发过程的每个人从日常执行…

    Python 2023年9月12日
    065
  • 多元统计分析 图标表示法 数据可视化 python 代码实现

    图的组成部分(取自matplotlib.org): 轮廓图 1. plt.contour( )方法 import matplotlib.pyplot as plt import n…

    Python 2023年9月2日
    046
  • 基于nonebot2搭建qq机器人

    对于所有nonebot搭建机器人框架,需要python3.7也上版本(nonebot文档说明),其实从创建项目到加入插件都还是简单,就是会遇到问题自己不清楚,也没人解答,看完应该都…

    Python 2023年8月4日
    058
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球