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

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

文章目录

引言

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

一、MongoDB 原子操作概述

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

二、单文档原子操作

1. 更新操作

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

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

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

2. 插入操作

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

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

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

javascript 复制代码
db.users.deleteOne(
    { _id: ObjectId("5f9c9d...") }
);

三、多文档原子操作

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

1. 启用事务

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

2. 使用事务

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

javascript 复制代码
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 集合。

javascript 复制代码
db.createCollection("inventory");
db.createCollection("transactions");
2. 执行事务

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

javascript 复制代码
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引用shell MongoDB教程(二):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集成mongoDB MongoDB教程(九):java集成mongoDB
MongoDB教程(十):Python集成mongoDB MongoDB教程(十):Python集成mongoDB
MongoDB教程(十一):MongoDB关系管理与文档关联 MongoDB教程(十一):MongoDB关系管理与文档关联
MongoDB教程(十二):MongoDB数据库索引 MongoDB教程(十二):MongoDB数据库索引
MongoDB教程(十四):MongoDB查询分析 MongoDB教程(十四):MongoDB查询分析

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

相关推荐
2601_967019513 分钟前
免费SSL与商业SSL证书对比:企业生产环境适用性评估
数据库
小诗懂技术13 分钟前
【sqlite3数据库】一站式学会 增删改查 以及数据库c接口编程
数据库·sqlite
风123456789~19 分钟前
【架构专栏】第6章 数据库设计基础知识 4/4
数据库·架构
IvorySQL43 分钟前
代价比较的变革——PostgreSQL执行计划干预增强深度解析
数据库·postgresql·ffmpeg
SL-staff44 分钟前
离散制造企业如何应对频繁插单?智能排产系统带来新思路
大数据·数据库·人工智能·技术教程·智能排产·jvs-aps·排产系统
码云数智-园园1 小时前
Oracle 锁等待、会话阻塞故障复盘:生产事故排查步骤
数据库·oracle
哈__2 小时前
从 MySQL 到在线表格:NocoDB 自托管部署、数据导入与远程访问
数据库·mysql
倔强的石头1063 小时前
高可用与无感扩容——分布式时序数据库选型指南
数据库·分布式·时序数据库
袋鼠云数栈11 小时前
实时湖仓如何真正做到“数据够新”?
大数据·数据库·人工智能·数据治理
ACP广源盛1392462567311 小时前
M6/M5 Pro Mac mini 端侧 AI 落地@ACP#YLB3116 中端多盘存储扩展在 AI 服务中的机会与应用场景
大数据·网络·数据库·人工智能·嵌入式硬件·macos