当前位置: 首页 > news >正文

MongoDB的原子性和多文档事务处理

        原子性和事务处理是数据库操作的核心,保证了数据的准确性。依据数据库原子性,数据库和使用数据库的人员定义事务处理的方式。本文依据Mongodb的官方文档,整理Mongodb数据库的原子性和事务处理方法。

Mongodb的原子操作

        Mongodb中,对单个文档的操作是原子的,即使一次文档更新中,更新了文档的多个嵌入文档,这个更新操作也是原子操作。

        当文档写入更新语句更新多个文档时,该操作不是原子的。如使用updateMany更新多个文档,insertMany向集合中插入多条数据,这样的操作都不是原子的。mongodb在执行过程中,mongodb会将多文档插入更新转化为单文档插入更新操作,保证每个文档的操作是原子的,并为每个单一文档操作添加操作日志。多文档操作更新数据的过程中,其他写操作有机会穿插进来。

多文档事务

        为了保证多文档事务的原子性,mongodb给出了多文档事务解决方案。

  • 在mongodb 4.0版本,mongodb 复制集支持多文档事务
  • 在mongodb4.2及以后版本,mongodb引入的分布式事务,添加了分片集群和复制集群的事务支持。通过分布式事务管理,mongodb能够保证跨文档,跨集合,跨数据库和不同数据库分片的操作事务管理。

        多文档事务是原子性的。当事务提交时,所有在事务中修改的文档都会被保存,更新后的数据对事务外部可见。如果事务中的部分操作需要回滚,整个事务中的操作都不会被提交。事务中所有需要更新的数据保持不变。

        借助多文档事务,开发人员保证数据操作的原子性。但操作多文档事务,与操作单文档相比,数据库性能会受到更大的影响。从数据库设计角度来说,多文档事务的支持,不应该成为更合理高效数据结构定义的替代品。大多数场景中,应该通过持续优化非标准的数据结构(数组和对象)定义来减少多文档事务。减少数据库操作等待时间,提高数据库效率。

事务中的操作

        下面列出了事务中允许和禁止的操作

  • 对已有集合的读写操作。如CRUD操作,集合操作等。
  • 4.4版本开始,在非分片集合事务中,可以添加集合并为新添加的集合创建索引
    • 允许隐式创建集合,如使用insert方法,向不存在的集合中插入数据。使用update、findAndModify操作不存在的集合,设置{upsert:true}
    • 显示创建集合,如使用create、db.createCollection() 命令创建集合
    • 事务中添加的索引,只能够为该事务中添加的空集合创建索引,或为不存在的集合添加索引,但该集合需要在本事务中创建。
    • 不可以为分片数据集事务添加集合
    • 分片数据集中,不可以使用操作符$graphLookup
    • 事务中显示的添加集合和创建索引,事务读取策略需要设置为本地(local)
  • 事务中允许操作来自不同数据库的集合
  • 禁止为包含多个分片数据集的事务添加新集合,如果开发人员在一个分片中写数据,在另一个分片中隐式添加新的集合,mongodb事务中并不会执行这两个操作
  • 不可以在限制集合中写入数据
  • 读取限制集合数据时,不可以使用snapshot读取策略。使用“snapshot”策略时, mongodb只能获取到不同分片区上一次majority-committed提交的数据
  • 事务中不可以读写config, admin, local数据库中的集合
  • 禁止向system.*集合写入数据。system.*是mongodb保留数据集合
  • 事务中不支持查看执行计划,不能在查询语句中使用explain()
  • 事务外部创建的cursor, 不可以在事务内部调用getMore()方法获取下一批查询数据
  • 事务内部创建的cursor, 不可以在事务外部调用getMore()方法
  • 自版本4.2开始,事务中第一步,不可以使用killCursors命令
  • 多文档事务中,禁止使用创建删除集合和索引这种对已有数据库结构有影响的操作。但允许操作事务中添加新的集合和索引。

相关文章:

MongoDB的原子性和多文档事务处理

原子性和事务处理是数据库操作的核心,保证了数据的准确性。依据数据库原子性,数据库和使用数据库的人员定义事务处理的方式。本文依据Mongodb的官方文档,整理Mongodb数据库的原子性和事务处理方法。 Mongodb的原子操作 Mongodb中&#xff0c…...

代理模式 1、静态代理 2、动态代理 jdk自带动态代理 3、Cglib代理

文章目录 代理模式1、静态代理2、动态代理jdk自带动态代理 3、Cglib代理 来和大家聊聊代理模式 代理模式 代理模式:即通过代理对象访问目标对象,实现目标对象的方法。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操…...

ELK+filebeat+kafka

无需创建logstash的端口,直接创建topic 远程收集mysql和httpd的日志 (一)安装nginx和mysql服务 1、打开mysql的日志功能 2、创建日志(创库、创表、添加数据) (1)mysql服务器上安装http system…...

LLVM学习笔记(63)

4.4.3.3.2.3. 向量操作数类型的处理 下面开始处理向量类型。在默认情形下这些操作都会拆分为更小的操作或者调用库。 X86TargetLowering::X86TargetLowering(续) 667 // Some FP actions are always expanded for vector types. 668 for…...

【python+requests】接口自动化测试

这两天一直在找直接用python做接口自动化的方法,在网上也搜了一些博客参考,今天自己动手试了一下。 一、整体结构 上图是项目的目录结构,下面主要介绍下每个目录的作用。 Common:公共方法:主要放置公共的操作的类,比如数据库sql…...

plt创建指定色系

1、创建不连续色系 import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap# 定义颜色的RGB值 colors [(0.2, 0.4, 0.6), # 蓝色(0.8, 0.1, 0.3), # 红色(0.5, 0.7, 0.2),(0.3,0.5,0.8)] # 绿色# 创建色系 cmap ListedColormap(colors)# 绘制…...

Java多线程-第20章

Java多线程-第20章 1.创建线程 Java是一种支持多线程编程的编程语言。多线程是指在同一程序中同时执行多个独立任务的能力。在Java中,线程是一种轻量级的子进程,它是程序中的最小执行单元。Java的多线程编程可以通过两种方式实现:继承Threa…...

寿险公司通过开源治理保障数字创新,安全打通高质量服务新通道

某寿险公司致力于为消费者提供人性化的产品和服务,在中国保险市场中始终保持前列。该寿险公司以挖掘和满足客户需求为出发点,从产品开发、渠道销售、运营流程和售后服务等各环节,借助数字化工具,不断地努力探索并提升服务品质。 精…...

SpringBoot中的部分注解

1.SpringBoot/spring SpringBootApplication: 包含Configuration、EnableAutoConfiguration、ComponentScan通常用在主类上; Repository: 用于标注数据访问组件,即DAO组件; Service: 用于标注业务层组件; RestController: 用…...

蓝桥杯-02-蓝桥杯C/C++组考点与14届真题

文章目录 蓝桥杯C/C组考点与14届真题参考资源C/C组考点1. 组别2. 竞赛赛程3. 竞赛形式4. 参赛选手机器环境5. 试题形式5.1. 结果填空题5.2. 编程大题 6. 试题考查范围7. 答案提交8. 评分9. 样题样题 1:矩形切割(结果填空题)样题 2&#xff1a…...

计算机杂谈系列精讲100篇-【计算机应用】关于TensorFlow和PyTorch的一些看法

目录 前言 知识储备 PyTorch使用高频代码 导入包和版本查询​​​​​​...

Uni-App知识点

文章目录 一、事件总线二、什么是事件总线三、触发事件1、监听事件2、只监听一次3、移除监听4、触发事件注意事项5、代码示例6、注意事项 一、事件总线 除了父子组件传参之外,兄弟组件之间共享信息也是我们经常会遇到的。如果遇到这类问题,我们现在可以…...

Postman如何使用(四):接口测试

一.接口 1.程序内部接口:方法与方法之间,模块与模块之间的交互,程序内部抛出的接口,比如bbs系统,有登录模块,发帖模块等等,那你要发帖就必须先登录,那么这两个模块就得有交互&#…...

【Qt绘图】之绘制坦克

使用绘图事件&#xff0c;绘制坦克。 效果 效果很逼真&#xff0c;想象力&#xff0c;有没有。 示例 代码像诗一样优雅&#xff0c;有没有。 包含头文件 #include <QApplication> #include <QWidget> #include <QPainter>绘制坦克类 class TankWidge…...

【机器视觉技术栈】- 机器视觉基础

1.1 为什么采用机器视觉 人眼与机器视觉对比 人眼机器视觉精确性差&#xff0c;64灰度级&#xff0c;不能分辨小于100微米的目标强&#xff0c;256灰度级&#xff0c;可检测微米级目标速度慢&#xff0c;无法看清间隔小于40毫秒的运动目标快&#xff0c;快门时间可达10微秒适…...

Arkts开发UIAbility组件生命周期启动模式开发详解【鸿蒙专栏-19】

文章目录 HarmonyOS UIAbility组件详解UIAbility组件概述声明配置UIAbility组件生命周期Create状态WindowStageCreate和WindowStageDestroy状态Foreground和Background状态Destroy状态UIAbility组件启动模式Singleton启动模式Standard启动模式Specified启动模式HarmonyOS UIAbi…...

力扣295. 数据流的中位数(java,堆解法)

Problem: 295. 数据流的中位数 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 由于该题目的数据是动态的我们可以维护两个堆来解决该问题 1.维护一个大顶堆&#xff0c;一个小顶堆 2.每个堆中元素个数接近n/2&#xff1b;如果n是偶数&#xff0c;两个堆中的数据个数…...

open3d-点云及其操作

open3d提供了一个专门用于点云的数据结构 PointCloud。 class PointCloud(Geometry3D):color # 颜色normals # 法向量points # 点云def __init__(self, *args, **kwargs):"""__init__(*args, **kwargs)Overloaded function.1. __init__(self: open3d.cpu.py…...

无人机助力电力设备螺母缺销智能检测识别,python基于YOLOv7开发构建电力设备螺母缺销高分辨率图像小目标检测系统

传统作业场景下电力设备的运维和维护都是人工来完成的&#xff0c;随着现代技术科技手段的不断发展&#xff0c;基于无人机航拍飞行的自动智能化电力设备问题检测成为了一种可行的手段&#xff0c;本文的核心内容就是基于YOLOv7来开发构建电力设备螺母缺销检测识别系统&#xf…...

如何使用Python的Open3D开源库进行三维数据处理

简介 在本文中&#xff0c;我提供了一个关于如何使用Python的Open3D库&#xff08;一个用于3D数据处理的开源库&#xff09;来探索、处理和可视化3D模型的快速演练。 使用Open3D可视化的3D模型&#xff08;链接https://sketchfab.com/3d-models/tesla-model-s-plaid-9de8855fa…...

JNI内存泄漏吞噬GPU显存,Java AI服务OOM频发,一线工程师紧急封堵的4类隐蔽陷阱

第一章&#xff1a;Java AI 推理调试Java 在 AI 推理场景中常通过 ONNX Runtime、Deep Java Library&#xff08;DJL&#xff09;或 TensorFlow Java API 集成模型。调试过程需聚焦于输入张量形状匹配、数据类型一致性、设备绑定状态及推理结果可信度验证。启用详细日志输出 DJ…...

Joy-Con Toolkit开源工具:Switch手柄深度定制与性能优化方案

Joy-Con Toolkit开源工具&#xff1a;Switch手柄深度定制与性能优化方案 【免费下载链接】jc_toolkit Joy-Con Toolkit 项目地址: https://gitcode.com/gh_mirrors/jc/jc_toolkit Joy-Con Toolkit是一款面向任天堂Switch玩家的开源手柄管理工具&#xff0c;提供专业级传…...

MoltenVK终极指南:动态库与静态库的完整选择方案

MoltenVK终极指南&#xff1a;动态库与静态库的完整选择方案 【免费下载链接】MoltenVK MoltenVK is a Vulkan Portability implementation. It layers a subset of the high-performance, industry-standard Vulkan graphics and compute API over Apples Metal graphics fram…...

高效管理Git仓库:彻底排除node_modules的实用指南

1. 为什么必须排除node_modules文件夹 每次新建Node.js项目时&#xff0c;npm或yarn都会自动生成node_modules目录来存放依赖包。这个文件夹通常包含成千上万个文件&#xff0c;比如一个基础Vue项目就可能超过200MB。我曾见过一个企业级项目的node_modules膨胀到1.2GB&#xff…...

Using Vulkan -- Pipeline Dynamic State

概述创建图形VkPipeline对象时&#xff0c;设置状态的逻辑流程如下&#xff1a;// 以视口状态为例 VkViewport viewport {0.0, 0.0, 32.0, 32.0, 0.0, 1.0};// 设置状态值 VkPipelineViewportStateCreateInfo viewportStateCreateInfo; viewportStateCreateInfo.pViewports &…...

Android BSP 开发修改轨迹

一、 Android BSP 整体开发修改轨迹图Android BSP 软件架构 │ ├── 【第1层&#xff1a;Bootloader 引导层】 │ ├── 1.1 一级引导程序&#xff08;Primary Bootloader&#xff09; │ │ ├── ROM Code&#xff08;芯片固化&#xff09; │ │ └── SPL /…...

WPS Zotero插件冲突解决方案

WPS Zotero插件冲突解决方案 【免费下载链接】WPS-Zotero An add-on for WPS Writer to integrate with Zotero. 项目地址: https://gitcode.com/gh_mirrors/wp/WPS-Zotero 在使用WPS进行文献管理时&#xff0c;你是否遇到过Zotero插件功能异常的情况&#xff1f;本文将…...

Windows HEIC缩略图插件:系统级集成架构深度解析

Windows HEIC缩略图插件&#xff1a;系统级集成架构深度解析 【免费下载链接】windows-heic-thumbnails Enable Windows Explorer to display thumbnails for HEIC files 项目地址: https://gitcode.com/gh_mirrors/wi/windows-heic-thumbnails 在跨平台数字内容管理日益…...

Legacy iOS Kit终极指南:解锁旧iOS设备的完整控制权

Legacy iOS Kit终极指南&#xff1a;解锁旧iOS设备的完整控制权 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 在…...

探索光伏 - 电池充电模型:稳定直流输出电压的技术之旅

光伏-电池充电模型&#xff0c;可以很好的稳定直流输出电压 采用最大功率跟踪MPPT算法&#xff0c;通过boost电路输出电压&#xff0c;电池侧采用电压电流PI双闭环控制&#xff0c;通过双向电路给电池充放电 直流侧参考电压为48v在光伏能源领域&#xff0c;确保稳定的直流输出电…...