MongoDB与Netezza中类似SQL SELECT FOR UPDATE的实现方案咨询
MongoDB和Netezza中类似SELECT FOR UPDATE的实现方案
MongoDB
MongoDB没有直接对应SQL中SELECT FOR UPDATE的语法,但可以通过两种方式实现特定文档的并发修改防护:
乐观锁方案
通过在文档中添加版本号字段(如version),利用原子更新操作实现并发控制:
- 查询目标文档,获取当前版本号
- 执行更新时,仅当版本号匹配时才修改文档并递增版本号
示例代码:
// 假设目标文档_id为ObjectId("60d21b4667d0d8992e610c85") const currentDoc = db.pollcheck.findOne({ _id: ObjectId("60d21b4667d0d8992e610c85") }); const updateResult = db.pollcheck.updateOne( { _id: ObjectId("60d21b4667d0d8992e610c85"), version: currentDoc.version }, { $set: { status: "inserted" }, $inc: { version: 1 } } ); // 如果updateResult.modifiedCount为0,说明有并发修改,需重试
悲观锁/事务方案
MongoDB 4.0及以上支持多文档事务,结合findOneAndUpdate原子操作可实现类似锁定的效果:
// 启动会话与事务 const session = db.getMongo().startSession(); session.startTransaction(); const coll = session.getDatabase("your_db").getCollection("pollcheck"); // 原子性查询并锁定修改文档 const targetDoc = coll.findOneAndUpdate( { status: { $ne: "processed", $ne: null } }, { $set: { status: "inserted" } }, { returnDocument: "before" } ); // 提交事务 session.commitTransaction(); session.endSession();
单文档操作本身是原子性的,多文档场景下事务会锁定涉及的文档直到事务完成。
Netezza
Netezza作为MPP架构的数据库,支持类似PostgreSQL的SELECT FOR UPDATE语法,可直接用于锁定特定记录避免并发修改:
示例代码:
BEGIN; SELECT * FROM pollcheck WHERE status != 'processed' OR status IS NULL FOR UPDATE; UPDATE pollcheck SET status = 'inserted' WHERE recordid = 3; COMMIT;
- 执行
SELECT ... FOR UPDATE后,匹配的行将被锁定,直到事务提交或回滚 - 由于Netezza的MPP特性,锁定会在各个数据切片上执行,整体效果与标准SQL的
SELECT FOR UPDATE一致
内容的提问来源于stack exchange,提问作者sujay777
相关产品推荐
相关产品推荐

