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

【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不支持事务),因此实战前需满足:

二、核心业务场景定义

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

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

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

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

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

1. 安装依赖

npm install mongodb
  • 数据初始化
// 删除现有集合
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" --port 27017 --dbpath .\mongodb\rs0-27017\data --logpath .\mongodb\rs0-27017\log\rs0-27017.log --replSet rs0 --bind_ip 0.0.0.0 --logappend
    ".MongoDB\Server\8.2\bin\mongod" --port 27018 --dbpath .\mongodb\rs0-27018\data --logpath .\mongodb\rs0-27018\log\rs0-27018.log --replSet rs0 --bind_ip 0.0.0.0 --logappend
    ".MongoDB\Server\8.2\bin\mongod" --port 27019  --dbpath .\mongodb\rs0-27019\data --logpath .\mongodb\rs0-27019\log\rs0-27019.log --replSet rs0 --bind_ip 0.0.0.0 --logappend
    @echo off
    title MongoDB 三节点副本集启动脚本
    color 0A
    echo ========================================
    echo MongoDB 三节点副本集启动器
    echo ========================================
    REM 停止所有已运行的 MongoDB 实例
    echo [1/5] 停止现有 MongoDB 进程...
    taskkill /F /IM mongod.exe 2>nul
    echo ✅ 已停止所有 MongoDB 进程
    REM 创建必要的目录
    echo [2/5] 创建目录结构...
    if not exist "D:\mongodb\rs0-27017\data" mkdir "D:\mongodb\rs0-27017\data"
    if not exist "D:\mongodb\rs0-27017\log" mkdir "D:\mongodb\rs0-27017\log"
    if not exist "D:\mongodb\rs0-27018\data" mkdir "D:\mongodb\rs0-27018\data"
    if not exist "D:\mongodb\rs0-27018\log" mkdir "D:\mongodb\rs0-27018\log"
    if not exist "D:\mongodb\rs0-27019\data" mkdir "D:\mongodb\rs0-27019\data"
    if not 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 /t 10 /nobreak >nul
    REM [4/5] 初始化副本集
    echo [4/5] 初始化副本集...
    echo 请按照以下步骤手动初始化副本集:
    echo.
    echo 1. 打开一个新的命令提示符窗口
    echo 2. 执行以下命令连接到 MongoDB:
    echo    "C:\Program Files\MongoDB\Server\8.2\bin\mongod" 目录下应该有 mongo.exe
    echo    如果没有,请从旧版 MongoDB 安装中复制 mongo.exe 到此目录
    echo.
    echo 3. 如果找到 mongo.exe,执行:
    echo    "C:\Program Files\MongoDB\Server\8.2\bin\mongo" --port 27017
    echo.
    echo 4. 在 mongo shell 中执行:
    echo    rs.initiate({
    
    echo      _id: "rs0",
    echo      members: [
    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.
    echo 5. 然后检查状态:
    echo    rs.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=rs0
    echo 所有节点连接: mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0
    echo ========================================
    echo.
    echo 注意: 需要手动初始化副本集(见上面的步骤)
    pause

    在这里插入图片描述

    const {
     MongoClient } = require('mongodb');
    // 1. 配置MongoDB副本集连接字符串
    const MONGODB_URI = 'mongodb://localhost:27017,localhost:27018,localhost:27019/?replicaSet=rs0';
    const DB_NAME = 'bank';
    const COLLECTION_NAME = 'accounts';
    // 重试配置
    const RETRY_MAX = 3;
    const RETRY_DELAY = 100;
    // 工具函数:事务重试
    async function withRetry(fn, maxRetries = RETRY_MAX, delay = RETRY_DELAY) {
    
    let retries = 0;
    while (retries < maxRetries) {
    
    try {
    
    return await fn();
    } catch (error)
http://www.jsqmd.com/news/316577/

相关文章:

  • 2026年国内家庭教育机构十大品牌权威推荐:科学赋能现代家庭育儿新实践
  • 【接口测试】1_Postman _Postman环境搭建 - 指南
  • 2026年口碑好的给袋包装机/立式包装机厂家推荐及选择指南
  • 出入境护照照片回执办理价格多少,广东有好用的平台吗?
  • 聊聊乐净石新房除甲醛性价比,佳使用方法及对装修材料影响
  • 2026年性价比高的培训机构排名,长春市欧米奇技能学历双丰收
  • 2026年盘点沪上好口碑婚介机构,绿洲婚介所选哪家好
  • 中水土工作为机织布制造商靠谱吗,产品价格贵不贵?
  • 教育论文的“数据炼金术”:书匠策AI如何把数字变成学术黄金
  • 教育论文的“数据炼金术”:书匠策AI如何让你的研究结论自带“科学滤镜”
  • 书匠策AI:让教育论文数据“开口说话”的魔法画笔——零代码、跨学科、动态可视化,重新定义学术数据分析
  • 国产Wiki系统崛起:Gitee Wiki如何成为关键领域研发团队的知识管理首选
  • Gitee领衔2026年项目管理工具变革:技术驱动与本土化优势的双重突破
  • 论文写作新纪元:书匠策AI如何用“数据魔法”重塑教育研究范式
  • 学术数据魔法师:书匠策AI如何让论文分析从“炼狱模式”秒切“开挂模式”
  • 教育科研新革命:书匠策AI如何用“数据魔法”重塑论文写作范式
  • 书匠策AI:教育论文数据分析的“未来实验室”,让数据开口说故事的魔法师
  • 科技成果转化新引擎——构建产学研协同创新生态
  • NodeJS:安装
  • 2026年靠谱的手持地面站定制公司排行榜,为你揭晓前十
  • 探讨杭州西服西装选购,知名品牌煜形象推荐给你
  • 2026年广东靠谱的塑料垃圾桶服务商推荐与费用分析
  • 2026巨量平台适配 短视频拍摄公司推荐
  • 2026年室内装修公司推荐,价格便宜的品牌有哪些
  • 信誉好的婚恋企业绿洲婚介所怎么收费?
  • 2026必学!AI Agent架构、A2A与MCP协议全解析,程序员收藏指南
  • 2026年上海靠谱的财务公司盘点 鑫诚财务服务好不好了解下
  • AI Agent技术解析:从ReAct框架到Manus,看AI如何学会“思考“
  • 随手剪-音频视频分割工具
  • 【三端毕设源码分享】基于springboot的会所产后护理系统的设计与实现(程序+文档+代码讲解+一条龙定制)