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

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 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【系列专题】新质生产力之光,照亮“制造强国”之路
  • 【SpringBoot】URL映射之consumes和produces匹配、params和header匹配
  • go-kratos 学习笔记(1) 安装
  • 【数据结构】树和二叉树
  • InternLM学习笔记
  • 图解RocketMQ之消息模型详解(1)
  • Java程序中常见问题
  • Linux源码阅读笔记14-IO体系结构与访问设备
  • LC61----1374. 生成每种字符都是奇数个的字符串(字符串)---java版
  • C++树(二)【直径,中心】
  • 初识dockerFile之RUN和WORKDIR
  • 在 VM 虚拟机中安装 openEuler + 桌面
  • 【RT摩拳擦掌】RT600 4路音频同步输入1路TDM输出方案
  • 自动导入unplugin-auto-import+unplugin-vue-components
  • 十八、指针
  • Android优雅地处理按钮重复点击
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • iOS编译提示和导航提示
  • Java新版本的开发已正式进入轨道,版本号18.3
  • k个最大的数及变种小结
  • Sass 快速入门教程
  • spring boot 整合mybatis 无法输出sql的问题
  • 设计模式 开闭原则
  • 时间复杂度与空间复杂度分析
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 详解NodeJs流之一
  • 消息队列系列二(IOT中消息队列的应用)
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • # 安徽锐锋科技IDMS系统简介
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #Datawhale AI夏令营第4期#AIGC文生图方向复盘
  • #QT(TCP网络编程-服务端)
  • #大学#套接字
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第1节 (全局数据、栈和堆)
  • (js)循环条件满足时终止循环
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (篇九)MySQL常用内置函数
  • (十三)MipMap
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (四)图像的%2线性拉伸
  • (五)c52学习之旅-静态数码管
  • (转)c++ std::pair 与 std::make
  • (转)ObjectiveC 深浅拷贝学习
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .Net 基于.Net8开发的一个Asp.Net Core Webapi小型易用框架
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .Net组件程序设计之线程、并发管理(一)
  • /bin/rm: 参数列表过长"的解决办法