mongodb 事务_初探MongoDB事务机制
背景
最近有一个业务需要同时写两个表,并且需要保证数据的正确性。我们的项目线上的 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事务机制相关推荐
- mysql mongodb 事务_认识MongoDB 4.0的新特性——事务(Transactions)
前言 相信使用过主流的关系型数据库的朋友对"事务(Transactions)"不会太陌生,它可以让我们把对多张表的多次数据库操作整合为一次原子操作,这在高并发场景下可以保证多个数据 ...
- mongodb适用于_适用于MongoDB和Mongometer的SpiderMonkey至V8
mongodb适用于 通过10gen将MongoDB 2.3 / 2.4的默认JavaScript引擎从SpiderMonkey切换到V8,我想我将借此机会使用mongometer比较这些发行版的相对 ...
- mysql sqlserver 事务_[MSSQL]SQLServer事务语法_MySQL
事务全部是关于原子性的.原子性的概念是指可以把一些事情当做一个单元来看待.从数据库的角度看,它是指应全部执行或全部都不执行的一条或多条语句的最小组合. 为了理解事务的概念,需要能够定义非常明确的边界. ...
- mongodb 百万_关于mongodb 百万级数据 去重 查询优化的问题
现有一个企业表company,里面有100万的数据,对应一个员工表user,每个企业ID company_id对应0到多条user数据,员工表中有300万条数据:具体结构如下: db.company. ...
- mysql mongodb 事务_MySQL PK MongoDB:多文档事务支持,谁更友好?
原标题:MySQL PK MongoDB:多文档事务支持,谁更友好? 作者介绍 贺春旸,凡普金科DBA团队负责人,<MySQL管理之道:性能调优.高可用与监控>第一.二版作者,曾任职于中国 ...
- golang操作mongodb的驱动mongo-go-driver的事务支持和访问控制(mongodb4.0)
关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿! 作者: sdghchj 本文链接:golang操作mongodb的驱动mongo-go-driver的事务支持和访问控制_s ...
- Redis 学习笔记-NoSQL数据库 常用五大数据类型 Redis配置文件介绍 Redis的发布和订阅 Redis_事务_锁机制_秒杀 Redis应用问题解决 分布式锁
1.NoSQL数据库 1.1 NoSQL数据库概述 NoSQL(NosQL = Not Only sQL ),意即"不仅仅是sQL",泛指非关系型的数据库.NoSQL不依赖业务逻辑 ...
- mysql 默认事务隔离级别_一文读懂MySQL的事务隔离级别及MVCC机制
回顾前文: <一文学会MySQL的explain工具> <一文读懂MySQL的索引结构及查询优化> (同时再次强调,这几篇关于MySQL的探究都是基于5.7版本,相关总结与结论 ...
- mongodb更新某个字段_直播 | MongoDB开源数据库的云上之路
本文转自阿里巴巴数据库技术 来了来了!就在今天(11月26号)阿里云-MongoDB战略合作发布会真的来了!一直被模仿从未没超越的开源界大牛MongoDB与亚太区云数据库TOP 1 阿里云数据库要联手 ...
最新文章
- 火遍AI圈的万字长文,Lecun却说“标题太好笑,作者发推宣战:欢迎来辩!
- python turtle画气球-菲菲用python编程绘制的父亲节礼物
- Session 'app': Error Installing APK
- java学习(七)java中抽象类及 接口
- 百度网盘搜索源码,新加分词功能,内容相关度聚合更高
- 安卓手机管理_安卓手机:管理工具
- cmake 生成mysql_采用cmake方式编译安装MySQL
- selenium实现chrome分屏截图的合并
- 生成逼真3D人偶,居然不用3D形状建模,还能学会你的舞步 | 三星CVPR Oral
- 谷歌造了个虚拟足球场,让AI像打FIFA一样做强化学习训练丨开源有API
- gradle入门(1-7)eclipse和gradle集成插件的安装和使用
- 【VirtualBox】设置NAT端口映射-SSH登录
- 每天2小时,吃透 985博士总结的这份目标检测、卷积神经网络和OpenCV学习资料笔记(20G高清/PPT/代码)...
- iOS研发助手DoraemonKit技术实现之Crash查看
- 地理时空大数据和深度学习的合作
- Python的numpy中axis=0、axis=1、axis=2解释
- OpenStack 快速进阶教程
- table 表格,table表格细边框设置,table表格禁止内容换行设置,table表格斑马线设置
- Zabbix监控通过企业微信报警
- 15版计算机应用基础知识整理,[电脑基础知识]计算机应用基础.ppt
热门文章
- 中国肠道大会 | 日程及嘉宾
- QIIME 2用户文档. 9数据导出Exporting data(2018.11)
- NEJM | 益生菌LGG治疗肠胃炎无效,Immunity|LGG促进生骨
- psRobot:植物小RNA分析系统
- php swoole编译,编译安装swoole1.7.9,PHP版本5.6.5
- R语言ggplot2可视化绘制分组水平并行条形图(bar plot)并为条形图内添加标签
- JetBrains DataGrip工具配置数据库过程详解
- 生物信息学常见数据格式 • fasta • fastq • gff/gtf
- 基因组组装(Genome Assembly)
- 计算机组成微程序设计,计算机组成原理微程序设计.doc