上一篇
📢 最新动态(2025年8月)
MongoDB 7.2版本近期强化了分布式事务性能,单分片事务延迟降低40%!这让原子操作在电商秒杀、金融交易等场景更游刃有余~
想象你在开发一个游戏商城系统:
1️⃣ 用户A用100金币购买皮肤
2️⃣ 系统要同时完成:
如果这两个操作不同步?后果可能是:
原子操作就是保证这些步骤要么全成功,要么全失败!
// 经典库存扣减案例 db.products.updateOne( { _id: 123, stock: { $gte: 1 } }, // 只有库存≥1才执行 { $inc: { stock: -1 } } // 原子减少库存 )
⚠️ 注意:MongoDB的原子性最小单位是单个文档,跨文档需要事务
const session = db.startSession(); session.startTransaction(); try { // 转账操作:A账户→B账户 db.accounts.updateOne( { _id: "A" }, { $inc: { balance: -100 } }, { session } ); db.accounts.updateOne( { _id: "B" }, { $inc: { balance: 100 } }, { session } ); session.commitTransaction(); console.log("转账成功 🎉"); } catch (err) { session.abortTransaction(); console.log("回滚操作 🔄", err); }
// 抢购场景:获取并修改订单状态 db.orders.findOneAndUpdate( { _id: 666, status: "pending" }, { $set: { status: "paid" } }, { returnNewDocument: true } // 返回修改后的文档 )
通过文档版本号避免脏写:
db.products.insertOne({ _id: "phone_1", name: "后浪旗舰机", price: 5999, version: 1 // 版本控制字段 }) // 更新时检查版本 db.products.updateOne( { _id: "phone_1", version: 1 }, { $set: { price: 5499 }, $inc: { version: 1 } } )
1️⃣ 分片集群事务:
2️⃣ 超时设置:
// 事务最长等待60秒 session.startTransaction({ maxCommitTimeMS: 60000 });
3️⃣ 重试逻辑:
function transferWithRetry(retries = 3) { try { //...事务代码 } catch (err) { if (err.errorLabels?.includes('TransientTransactionError') && retries > 0) { console.log(`自动重试剩余 ${retries} 次 🔄`); return transferWithRetry(retries - 1); } throw err; } }
✅ 嵌入式文档:把频繁更新的关联数据放在同一文档
// 用户文档内嵌地址 { _id: "user123", name: "后浪小哥", addresses: [ { type: "home", city: "北京" }, { type: "work", city: "上海" } ] }
✅ 批量操作:使用bulkWrite
减少网络开销
db.products.bulkWrite([ { updateOne: { filter: {_id:1}, update: {$inc:{views:1}} }}, { updateOne: { filter: {_id:2}, update: {$set:{status:"hot"}} }} ])
✨ MongoDB原子操作选择策略:
| 场景 | 推荐方案 |
|-------|----------|
| 单文档更新 | 直接使用更新操作符 |
| 简单跨文档 | findAndModify+嵌入式设计 |
| 复杂业务流 | 多文档事务 |
| 高并发竞争 | 乐观锁+重试机制 |
没有银弹! 根据业务特点选择最适合的方案才是王道 👑
(注:本文示例基于MongoDB 7.2语法,部分特性旧版本可能不支持)
本文由 房蕙兰 于2025-08-07发表在【云服务器提供商】,文中图片由(房蕙兰)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://up.7tqx.com/wenda/556682.html
发表评论