背景

最近有一个业务需要同时写两个表,并且需要保证数据的正确性。我们的项目线上的 MongoDB 版本是 4.0,查了一下发现 4.0 版本的 MongoDB 已经支持副本集中的事务了,于是做了一下调研。

准备环境

鉴于 MongoDB 的事务支持需要在副本集中才生效,我用 Docker-Compose 部署了一个一主两从结构的 4.0 版本 MongoDB 副本集(部署过程参考了[文章][1]。

初始化数据

假设有两个表,订单表(orders)和库存表(inventory), 对于一个下单行为:创建一个购买了商品 A x 件的订单,需要增加一条 orders 表记录表明购买了 x 件商品 A,同时商品 A 对应的库存表记录的库存也要减少 x 件。

import pymongoclient = pymongo.MongoClient(    host="mongodb://root:123@localhost:37011"    )db = client.get_database("test")db.inventory.insert_one({"sku": "abc", "qty": 100000})

在代码中我们初始化了十万件商品 abc。

编写事务代码

import pymongoimport sysclient = pymongo.MongoClient(    host="mongodb://root:123@localhost:37011"    )db = client.get_database("test")with client.start_session() as session:    with session.start_transaction():        print(            db.orders.insert_one(                {"sku": "abc", "qty": 1000},                session=session,            ).inserted_id        )        # sys.exit(0)        print(            db.inventory.find_one_and_update(                {"sku": "abc"},                {"$inc": {"qty": -1000}},                return_document=pymongo.ReturnDocument.AFTER,                session=session,            )        )print(    list(        db.orders.aggregate(            [              {"$match": {"sku": "abc"}},              {"$group": {"_id": None, "total": {"$sum": "$qty"}}},            ]        )    )[0])

我们将增加订单与修改库存的操作放到一个事务里,并观察abc商品在所有订单中的数量和和其库存剩余。

验证

可以看到在正常执行的情况下聚合的 abc 商品的销量与库存的 abc 商品的数量总和始终为 100000。

事务中断

我们取消对`sys.exit(0)`所在行代码的注释,模拟创建订单后接口异常退出的情况(此时还没有修改商品的库存)。

我们可以检查一下事务中断前插入订单记录有没有被回滚删除掉。

意料之中的是这两条记录并不存在,对于终端用户来说订单并没有创建成功。

我们再重新注释掉`sys.exit(0)`语句,看一下现在的商品`abc`的数量。

可以看到商品`abc`的已售出数量和库存剩余数量之和仍然为十万,失败的事务并没有影响到数据正确。

总结

在 MongoDB 4.0 版本中,我们已经可以使用数据库事务来保证多表操作下数据的正确性了,不过事务始终会对数据库性能造成一定的影响,能在业务层面避免同时操作多表就再好不过了。

相关链接

[1]: http://monkeywie.cn/2020/03/10/mongodb-replica-set/

mongodb 事务_初探MongoDB事务机制相关推荐

  1. mysql mongodb 事务_认识MongoDB 4.0的新特性——事务(Transactions)

    前言 相信使用过主流的关系型数据库的朋友对"事务(Transactions)"不会太陌生,它可以让我们把对多张表的多次数据库操作整合为一次原子操作,这在高并发场景下可以保证多个数据 ...

  2. mongodb适用于_适用于MongoDB和Mongometer的SpiderMonkey至V8

    mongodb适用于 通过10gen将MongoDB 2.3 / 2.4的默认JavaScript引擎从SpiderMonkey切换到V8,我想我将借此机会使用mongometer比较这些发行版的相对 ...

  3. mysql sqlserver 事务_[MSSQL]SQLServer事务语法_MySQL

    事务全部是关于原子性的.原子性的概念是指可以把一些事情当做一个单元来看待.从数据库的角度看,它是指应全部执行或全部都不执行的一条或多条语句的最小组合. 为了理解事务的概念,需要能够定义非常明确的边界. ...

  4. mongodb 百万_关于mongodb 百万级数据 去重 查询优化的问题

    现有一个企业表company,里面有100万的数据,对应一个员工表user,每个企业ID company_id对应0到多条user数据,员工表中有300万条数据:具体结构如下: db.company. ...

  5. mysql mongodb 事务_MySQL PK MongoDB:多文档事务支持,谁更友好?

    原标题:MySQL PK MongoDB:多文档事务支持,谁更友好? 作者介绍 贺春旸,凡普金科DBA团队负责人,<MySQL管理之道:性能调优.高可用与监控>第一.二版作者,曾任职于中国 ...

  6. golang操作mongodb的驱动mongo-go-driver的事务支持和访问控制(mongodb4.0)

    关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! 作者: sdghchj 本文链接:golang操作mongodb的驱动mongo-go-driver的事务支持和访问控制_s ...

  7. Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁

    1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...

  8. mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制

    回顾前文: <一文学会MySQL的explain工具> <一文读懂MySQL的索引结构及查询优化> (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论 ...

  9. mongodb更新某个字段_直播 | MongoDB开源数据库的云上之路

    本文转自阿里巴巴数据库技术 来了来了!就在今天(11月26号)阿里云-MongoDB战略合作发布会真的来了!一直被模仿从未没超越的开源界大牛MongoDB与亚太区云数据库TOP 1 阿里云数据库要联手 ...

最新文章

  1. 火遍AI圈的万字长文,Lecun却说“标题太好笑,作者发推宣战:欢迎来辩!
  2. python turtle画气球-菲菲用python编程绘制的父亲节礼物
  3. Session 'app': Error Installing APK
  4. java学习(七)java中抽象类及 接口
  5. 百度网盘搜索源码,新加分词功能,内容相关度聚合更高
  6. 安卓手机管理_安卓手机:管理工具
  7. cmake 生成mysql_采用cmake方式编译安装MySQL
  8. selenium实现chrome分屏截图的合并
  9. 生成逼真3D人偶,居然不用3D形状建模,还能学会你的舞步 | 三星CVPR Oral
  10. 谷歌造了个虚拟足球场,让AI像打FIFA一样做强化学习训练丨开源有API
  11. gradle入门(1-7)eclipse和gradle集成插件的安装和使用
  12. 【VirtualBox】设置NAT端口映射-SSH登录
  13. 每天2小时,吃透 985博士总结的这份目标检测、卷积神经网络和OpenCV学习资料笔记(20G高清/PPT/代码)...
  14. iOS研发助手DoraemonKit技术实现之Crash查看
  15. 地理时空大数据和深度学习的合作
  16. Python的numpy中axis=0、axis=1、axis=2解释
  17. OpenStack 快速进阶教程
  18. table 表格,table表格细边框设置,table表格禁止内容换行设置,table表格斑马线设置
  19. Zabbix监控通过企业微信报警
  20. 15版计算机应用基础知识整理,[电脑基础知识]计算机应用基础.ppt

热门文章

  1. 中国肠道大会 | 日程及嘉宾
  2. QIIME 2用户文档. 9数据导出Exporting data(2018.11)
  3. NEJM | 益生菌LGG治疗肠胃炎无效,Immunity|LGG促进生骨
  4. psRobot:植物小RNA分析系统
  5. php swoole编译,编译安装swoole1.7.9,PHP版本5.6.5
  6. R语言ggplot2可视化绘制分组水平并行条形图(bar plot)并为条形图内添加标签
  7. JetBrains DataGrip工具配置数据库过程详解
  8. 生物信息学常见数据格式 • fasta • fastq • gff/gtf
  9. 基因组组装(Genome Assembly)
  10. 计算机组成微程序设计,计算机组成原理微程序设计.doc