news 2026/6/16 23:29:28

【MongoDB实战】7.2 事务实战:转账场景数据一致性保证(完整实操代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【MongoDB实战】7.2 事务实战:转账场景数据一致性保证(完整实操代码)

文章目录

  • 《MongoDB实战入门》7.2 事务实战:转账场景数据一致性保证(完整实操代码)
    • 一、前置说明:MongoDB事务的核心前提
    • 二、核心业务场景定义
    • 三、Node.js版本实战代码(基于mongodb驱动5.x)
      • 1. 安装依赖
      • 2. 完整实操代码
      • 3. 运行结果说明
    • 四、Python版本实战代码(基于pymongo 4.x)
      • 1. 安装依赖
      • 2. 完整实操代码
    • 五、事务核心流程拆解(通用)
    • 六、关键注意事项
    • 七、扩展场景:批量转账事务

《MongoDB实战入门》7.2 事务实战:转账场景数据一致性保证(完整实操代码)

一、前置说明:MongoDB事务的核心前提

MongoDB 4.0+ 支持多文档事务,但仅在副本集环境下生效(单节点MongoDB不支持事务),因此实战前需满足:

    1. 部署MongoDB副本集(本地测试可参考MongoDB官方文档搭建单节点副本集);
    1. 安装对应编程语言的MongoDB驱动(本文提供Node.js/Python双版本代码,覆盖主流场景);
    1. 核心逻辑:转账的“扣款”和“到账”必须在同一个事务中执行,确保原子性(要么全成功,要么全失败)

二、核心业务场景定义

模拟两个账户(账户A:_id=1,账户B:_id=2)的转账操作:

  • 账户A向账户B转账100元;

  • 要求:若扣款失败(如A余额不足)、到账失败或网络异常,整个操作回滚,数据恢复到初始状态;

  • 数据模型:accounts集合存储账户信息,结构为{_id: Number, balance: Number}

三、Node.js版本实战代码(基于mongodb驱动5.x)

1. 安装依赖

npminstallmongodb
  • 数据初始化
// 删除现有集合db.accounts.drop();// 插入初始数据db.accounts.insertMany([{_id:1,balance:500,name:"Alice",is_vip:true},{_id:2,balance:200,name:"Bob",is_vip:false}]);// 创建必要的索引db.accounts.createIndex({name:1});db.accounts.createIndex({is_vip:1,balance:1});// 显示结果print("数据库初始化完成");print("账户数量: "+db.accounts.countDocuments());print("索引:");db.accounts.getIndexes().forEach(idx=>print(" - "+idx.name));


2. 完整实操代码

  • 集群启动bat( start_all.bat )代码

    ".MongoDB\Server\8.2\bin\mongod"--port27017--dbpath .\mongodb\rs0-27017\data --logpath .\mongodb\rs0-27017\log\rs0-27017.log --replSet rs0 --bind_ip0.0.0.0 --logappend".MongoDB\Server\8.2\bin\mongod"--port27018--dbpath .\mongodb\rs0-27018\data --logpath .\mongodb\rs0-27018\log\rs0-27018.log --replSet rs0 --bind_ip0.0.0.0 --logappend".MongoDB\Server\8.2\bin\mongod"--port27019--dbpath .\mongodb\rs0-27019\data --logpath .\mongodb\rs0-27019\log\rs0-27019.log --replSet rs0 --bind_ip0.0.0.0 --logappend
    @echo off title MongoDB 三节点副本集启动脚本 color 0Aecho========================================echoMongoDB 三节点副本集启动器echo========================================REM 停止所有已运行的 MongoDB 实例echo[1/5]停止现有 MongoDB 进程... taskkill /F /IM mongod.exe2>nulecho✅ 已停止所有 MongoDB 进程 REM 创建必要的目录echo[2/5]创建目录结构...ifnot exist"D:\mongodb\rs0-27017\data"mkdir"D:\mongodb\rs0-27017\data"ifnot exist"D:\mongodb\rs0-27017\log"mkdir"D:\mongodb\rs0-27017\log"ifnot exist"D:\mongodb\rs0-27018\data"mkdir"D:\mongodb\rs0-27018\data"ifnot exist"D:\mongodb\rs0-27018\log"mkdir"D:\mongodb\rs0-27018\log"ifnot exist"D:\mongodb\rs0-27019\data"mkdir"D:\mongodb\rs0-27019\data"ifnot exist"D:\mongodb\rs0-27019\log"mkdir"D:\mongodb\rs0-27019\log"echo✅ 目录创建完成 REM 启动三个 MongoDB 实例echo[3/5]启动三个 MongoDB 实例...echo启动节点1(端口:27017)... start"MongoDB-27017"cmd /k""C:\Program Files\MongoDB\Server\8.2\bin\mongod" --port 27017 --dbpath D:\mongodb\rs0-27017\data --logpath D:\mongodb\rs0-27017\log\rs0-27017.log --replSet rs0 --bind_ip 0.0.0.0 --logappend"echo启动节点2(端口:27018)... start"MongoDB-27018"cmd /k""C:\Program Files\MongoDB\Server\8.2\bin\mongod" --port 27018 --dbpath D:\mongodb\rs0-27018\data --logpath D:\mongodb\rs0-27018\log\rs0-27018.log --replSet rs0 --bind_ip 0.0.0.0 --logappend"echo启动节点3(端口:27019)... start"MongoDB-27019"cmd /k""C:\Program Files\MongoDB\Server\8.2\bin\mongod" --port 27019 --dbpath D:\mongodb\rs0-27019\data --logpath D:\mongodb\rs0-27019\log\rs0-27019.log --replSet rs0 --bind_ip 0.0.0.0 --logappend"echo✅ 所有实例已启动echo等待实例启动完成...timeout/t10/nobreak>nul REM[4/5]初始化副本集echo[4/5]初始化副本集...echo请按照以下步骤手动初始化副本集: echo.echo1. 打开一个新的命令提示符窗口echo2. 执行以下命令连接到 MongoDB:echo"C:\Program Files\MongoDB\Server\8.2\bin\mongod"目录下应该有 mongo.exeecho如果没有,请从旧版 MongoDB 安装中复制 mongo.exe 到此目录 echo.echo3. 如果找到 mongo.exe,执行:echo"C:\Program Files\MongoDB\Server\8.2\bin\mongo"--port27017echo.echo4. 在 mongo shell 中执行:echors.initiate({echo_id:"rs0",echomembers:[echo{_id:0, host:"localhost:27017", priority:1},echo{_id:1, host:"localhost:27018", priority:0.5},echo{_id:2, host:"localhost:27019", priority:0.5}echo]echo})echo.echo5. 然后检查状态:echors.status()echo. pause REM[5/5]显示状态echo[5/5]显示副本集状态...echo按任意键测试连接... pause>nul REM 测试连接echo测试连接..."C:\Program Files\MongoDB\Server\8.2\bin\mongod"--version echo.echo========================================echo副本集启动完成(需要手动初始化)!echo主节点连接: mongodb://localhost:27017/?replicaSet=rs0echo所有节点连接: mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0echo========================================echo.echo注意: 需要手动初始化副本集(见上面的步骤) pause

    const{MongoClient}=require('mongodb');// 1. 配置MongoDB副本集连接字符串constMONGODB_URI='mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0';constDB_NAME='bank';constCOLLECTION_NAME='accounts';// 重试配置constRETRY_MAX=3;constRETRY_DELAY=100;// 工具函数:事务重试async functionwithRetry(fn,maxRetries=RETRY_MAX,delay=RETRY_DELAY){let retries=0;while(retries<maxRetries){try{returnawaitfn();}catch(error)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 0:39:30

HTML如何设计JQuery支持大文件上传的拖拽功能?

2023年11月2日 星期四 阴有小雨 外包项目日志 - 企业级大文件传输系统Day3 项目背景与架构设计 客户是某地质勘探研究院&#xff0c;每日需上传**20GB**的勘探数据&#xff08;含激光扫描点云、地质剖面图等&#xff09;&#xff0c;要求&#xff1a; 文件夹结构保留&#xf…

作者头像 李华
网站建设 2026/6/16 14:08:54

yolo-ORBSLAM2复现

这个也是一个经典的问题了&#xff0c;我是想复现&#xff0c;再进行修改&#xff0c;因为我不使用yolo作为检测&#xff0c;但要先搞清楚检测框是怎么送入slam的&#xff0c;所以先复现各位大佬们的。主要参考&#xff1a; https://github.com/JinYoung6/orbslam_addsemantic…

作者头像 李华
网站建设 2026/6/15 23:45:50

python基于大数据技术的购房推荐系统的设计与实现

Python基于大数据技术的购房推荐系统的设计与实现是一个复杂但具有广泛应用前景的项目。以下是对该系统的详细介绍&#xff1a; 一、系统概述 购房推荐系统利用Python编程语言的强大功能和丰富的大数据技术&#xff0c;结合机器学习算法和推荐算法&#xff0c;对购房数据进行深…

作者头像 李华
网站建设 2026/6/16 23:06:15

介观交通流仿真软件:DynusT_(20).DynusT在实际项目中的应用

DynusT在实际项目中的应用 在上一节中&#xff0c;我们已经了解了DynusT的基本功能和使用方法。本节将详细介绍如何在实际项目中应用DynusT进行交通流仿真。我们将通过具体的案例来展示如何设置仿真参数、导入交通网络数据、模拟交通流量以及分析仿真结果。这些案例将涵盖城市交…

作者头像 李华
网站建设 2026/6/14 15:28:10

深入JVM(三):JVM执行引擎

JVM执行引擎 一、JVM前后端编译 前端编译&#xff1a;使用编译器将Java文件编译成class字节码文件后端编译&#xff1a;将class字节码文件编译成机器码指令java 跨平台直接理解&#xff1a;前端编译将java文件编译成class文件&#xff0c; 然后使用jvm&#xff08;后端编译&…

作者头像 李华
网站建设 2026/6/13 17:31:23

通信系统仿真:通信系统基础理论_(8).抗干扰技术

抗干扰技术 1. 引言 在通信系统中,信号的传输会受到各种干扰的影响,这些干扰可能来自自然环境(如电磁波、雷电等)或人为因素(如其他通信系统、电子设备等)。这些干扰会降低通信系统的性能,导致信号失真、误码率增加等问题。因此,研究和应用抗干扰技术是非常重要的。本…

作者头像 李华