MongoDB教程(十五):MongoDB原子操作

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、MongoDB 原子操作概述
      • 二、单文档原子操作
        • 1. 更新操作
        • 2. 插入操作
        • 3. 删除操作
      • 三、多文档原子操作
        • 1. 启用事务
        • 2. 使用事务
      • 四、案例:库存管理系统
        • 1. 创建集合
        • 2. 执行事务
      • 五、结论

引言

在多线程或分布式环境中,保证数据一致性是一项重大挑战。原子操作是解决这一问题的关键技术之一,它确保一系列操作要么全部成功,要么全部失败,从而维持数据的完整性和一致性。MongoDB 提供了一系列内置的原子操作,使开发者能够轻松地在数据库层面实现事务性和数据完整性。本文将深入探讨 MongoDB 中的原子操作,包括更新、插入和删除操作的原子性,并通过具体案例代码展示如何在实际应用中运用这些原子操作。

一、MongoDB 原子操作概述

MongoDB 中的原子操作通常指的是在单个文档或单个写操作级别上,确保操作的不可分割性和隔离性。在4.0版本之后,MongoDB 还引入了多文档事务,允许在多个文档或集合上执行跨文档的原子操作。

二、单文档原子操作

1. 更新操作

MongoDB 的更新操作天然具备原子性。例如,updateOne()updateMany() 方法保证了更新操作要么完全应用,要么完全不应用。

db.users.updateOne({ _id: ObjectId("5f9c9d...") },{ $inc: { balance: 100 } }
);

在这个例子中,如果更新操作因为某种原因(比如磁盘满)失败,那么文档的balance字段将保持不变,确保了数据的一致性。

2. 插入操作

insertOne()insertMany() 方法同样具有原子性,如果插入失败,文档将不会被部分插入。

db.users.insertOne({ _id: "123", name: "John Doe", age: 30 }
);
3. 删除操作

deleteOne()deleteMany() 方法同样保证了操作的原子性。

db.users.deleteOne({ _id: ObjectId("5f9c9d...") }
);

三、多文档原子操作

在 MongoDB 4.0 及以上版本中,可以使用事务来实现跨文档的原子操作。

1. 启用事务

事务在副本集或分片集群中是可用的,需要在配置服务器中启用事务。

2. 使用事务

事务操作需要在 withTransaction() 函数中定义,该函数接收一个回调函数作为参数,在这个回调函数中可以执行一系列的写操作。

const session = db.getMongo().startSession();
session.startTransaction();try {db.users.updateOne({ _id: ObjectId("5f9c9d...") },{ $inc: { balance: 100 } },{ session });db.transactions.insertOne({ _id: "tx123", description: "Deposit", amount: 100 },{ session });session.commitTransaction();
} catch (error) {session.abortTransaction();
} finally {session.endSession();
}

在这个例子中,如果更新操作或插入操作中的任何一个失败,事务将被回滚,所有操作都不会被应用。

四、案例:库存管理系统

假设我们正在构建一个库存管理系统,需要确保在减少商品库存的同时,记录一笔交易日志。这是一个典型的需要多文档原子操作的场景。

1. 创建集合

首先,创建 inventorytransactions 集合。

db.createCollection("inventory");
db.createCollection("transactions");
2. 执行事务

使用事务来减少库存并记录交易。

const session = db.getMongo().startSession();
session.startTransaction();try {db.inventory.updateOne({ _id: "item123" },{ $inc: { quantity: -1 } },{ session });db.transactions.insertOne({ _id: "tx456", item: "item123", quantity: -1 },{ session });session.commitTransaction();
} catch (error) {session.abortTransaction();
} finally {session.endSession();
}

五、结论

MongoDB 的原子操作是确保数据一致性和事务性的重要机制。无论是单文档操作还是多文档事务,正确使用原子操作可以有效防止数据不一致的问题,尤其是在并发或分布式环境下。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【MongoDB系列】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

MongoDB相关文章索引文章链接
MongoDB教程(一):Linux系统安装mongoDB详细教程MongoDB教程(一):Linux系统安装mongoDB详细教程
MongoDB教程(二):mongoDB引用shellMongoDB教程(二):mongoDB引用shell
MongoDB教程(三):mongoDB用户管理MongoDB教程(三):mongoDB用户管理
MongoDB教程(四):mongoDB索引MongoDB教程(四):mongoDB索引
MongoDB教程(五):mongoDB聚合框架MongoDB教程(五):mongoDB聚合框架
MongoDB教程(六):mongoDB复制副本集MongoDB教程(六):mongoDB复制副本集
MongoDB教程(七):mongoDB分片MongoDB教程(七):mongoDB分片
MongoDB教程(八):mongoDB数据备份与恢复MongoDB教程(八):mongoDB数据备份与恢复
MongoDB教程(九):java集成mongoDBMongoDB教程(九):java集成mongoDB
MongoDB教程(十):Python集成mongoDBMongoDB教程(十):Python集成mongoDB
MongoDB教程(十一):MongoDB关系管理与文档关联MongoDB教程(十一):MongoDB关系管理与文档关联
MongoDB教程(十二):MongoDB数据库索引MongoDB教程(十二):MongoDB数据库索引
MongoDB教程(十四):MongoDB查询分析MongoDB教程(十四):MongoDB查询分析

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11 深度推荐模型演化中的“范式替换“灵活组合

上一课时,我们介绍了 DIEN 模型添加了 RNN中 的 GRU,使模型获得了对序列数据的建模能力;而 DSIN 模型不仅使用了 RNN 中的 bi-LSTM,还使用了 Transformer 组件。 由此可见,在新的演化模型中,根据场景和数据…

Lua脚本简单理解

目录 1.安装 2.语法 2.1Lua数据类型 2.2变量 2.3lua循环 2.4流程控制 2.5函数 2.6运算符 2.7关系运算符 3.lua脚本在redis中的使用 3.1lua脚本再redis简单编写 3.2普通锁Lua脚本 3.3可重入锁lua脚本 1.安装 centos安装 安装指令: yum -y update yum i…

学习Servlet

什么是Servlet? Servlet是sun公司提供的一门用于开发动态web资源的技术,可以实现和客户端的交互,接收客户端请求和给客户端返回响应。 Servlet的实现类 Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet…

Python学习计划——4.3常见的异常类型和处理方法

在编写程序时,难免会遇到各种异常情况。Python 提供了一系列内置的异常类型,可以用于捕获和处理不同类型的错误。了解这些常见的异常类型有助于编写健壮的代码。 1. 常见的异常类型 IndexError 当尝试访问列表、元组或其他序列中不存在的索引时&#…

等保测评与供应链安全:确保整个生态链的安全无虞

在当今数字化时代,信息技术的飞速发展极大地推动了政府和企业单位的数字化转型。然而,这一进程也伴随着潜在的信息安全威胁,尤其是在供应链环节。等保测评(信息安全等级保护测评)与供应链安全管理的结合,成…

本地部署VMware ESXi服务实现无公网IP远程访问管理服务器

文章目录 前言1. 下载安装ESXi2. 安装Cpolar工具3. 配置ESXi公网地址4. 远程访问ESXi5. 固定ESXi公网地址 前言 在虚拟化技术日益成熟的今天,VMware ESXi以其卓越的性能和稳定性,成为了众多企业构建虚拟化环境的首选。然而,随着远程办公和跨…

CCS光源的高输出TH2系列平面光源

光源在机器视觉系统中起着重要作用,不同环境、场景及应用合适光源都不一样,今天我们来看看高输出TH2系列平面光源。它可以对应高速化的生产线,为提高生产效率做出贡献。 TH2系列光源的特点: 1、实现了更高一级的高亮度 实现了更…

谷粒商城实战笔记-56~57-商品服务-API-三级分类-修改-拖拽功能完成

文章目录 一,56-商品服务-API-三级分类-修改-拖拽功能完成二,57-商品服务-API-三级分类-修改-批量拖拽效果1,增加按钮2,多次拖拽一次保存完整代码 在构建商品服务API中的三级分类修改功能时,拖拽排序是一个直观且高效的…

Java | Leetcode Java题解之第260题只出现一次的数字III

题目: 题解: class Solution {public int[] singleNumber(int[] nums) {int xorsum 0;for (int num : nums) {xorsum ^ num;}// 防止溢出int lsb (xorsum Integer.MIN_VALUE ? xorsum : xorsum & (-xorsum));int type1 0, type2 0;for (int n…

Prometheus配置alertmanager告警

1、拉取镜像并运行 1、配置docker镜像源 [rootlocalhost ~]# vim /etc/docker/daemon.json {"registry-mirrors": ["https://dfaad.mirror.aliyuncs.com"] } [rootlocalhost ~]# systemctl daemon-reload [rootlocalhost ~]# systemctl restart docker2、…

刷题了: 151.翻转字符串里的单词 |卡码网:55.右旋转字符串

151.翻转字符串里的单词 题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/description/ 文章讲解:https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html 视频讲解:https://www.bilibi…

vue2之jessibuca视频插件使用教程

vue2之jessibuca视频插件使用教程 jessibuca简介前期准备下载相关jsvue index.html文件引入 组件封装使用小知识 引入iconfont jessibuca简介 Jessibuca是一款开源的纯H5直播流播放器,通过Emscripten将音视频解码库编译成Js(ams.js/wasm)运行于浏览器之中…

PHP基础语法(五)

一、定义语法 1、索引数组 2、php5.4之后简化的语法 3、关联数组 4、多维数组 $colors array("Red", "Green", "Blue");$colors ["Red", "Green", "Blue"];$person array("name" > "Jo…

基于PyCharm在Windows系统上远程连接Linux服务器中Docker容器进行Python项目开发与部署

文章目录 摘要项目结构项目开发项目上线参考文章 摘要 本文介绍了如何在Windows 10系统上使用PyCharm专业版2024.1,通过Docker容器在阿里云CentOS 7.9服务器上进行Python项目的开发和生产部署。文章详细阐述了项目结构的搭建、PyCharm的使用技巧、以及如何将开发项…

Superset二次开发之Dashboard状态变更源码解读

接口PUTapi/v1/dashboard/<dashboard_ID>前端文件 superset-frontend\src\dashboard\components\PublishedStatus\index.jsx 69行 togglePublished() togglePublished() { this.props.savePublished(this.props.dashboardId, !this.props.isPublished); } …

基于深度学习的医学影像分类

基于深度学习的医学影像分类是利用深度学习模型对医学影像&#xff08;如X光片、CT、MRI等&#xff09;进行自动分类&#xff0c;以辅助医生进行疾病诊断和治疗决策。以下是对这一领域的系统介绍&#xff1a; 1. 任务和目标 医学影像分类的主要任务和目标包括&#xff1a; 疾…

12.Spring事务和事务传播机制

文章目录 1.为什么需要事务2.Spring 中事务的实现2.1 MySQL 中的事务使⽤2.2 Spring 编程式事务2.3 Spring 声明式事务&#xff08;自动&#xff09;2.3.1 Transactional 作⽤范围2.3.2 Transactional 参数说明2.3.3 注意事项2.3.4 Transactional ⼯作原理 3.事务隔离级别3.1 事…

vue+element的table合并单元格(竖着合并行)及合计行添加并计算

1 效果: 代码分析: 1 表格头配置: 2 懒得写的:自己复制吧 <el-table:data"tableData"style"width: 98%":height"height"v-loading"isLoading"stripe"false" :span-method"objectSpanMethod"show-summary:summ…

c++ 线程

在 C 中&#xff0c;std::thread 构造函数可以用于将参数传递给线程。这里是一个基本的示例&#xff0c;展示了如何使用 std::thread 来传递参数&#xff1a; #include <iostream> #include <thread>// 定义一个被线程调用的函数 void threadFunc(int arg1, doubl…

C++多线程编程中的锁详解

在现代软件开发中&#xff0c;多线程编程是提升应用程序性能和响应能力的重要手段。然而&#xff0c;多线程编程也带来了数据竞争和死锁等复杂问题。为了确保线程间的同步和共享数据的一致性&#xff0c;C标准库提供了多种锁机制。 1. std::mutex std::mutex是最基础的互斥锁…