面试题答案
一键面试以下是使用MongoDB Shell在MongoDB 4.0及以上版本实现该复杂事务的代码及说明:
代码逻辑
- 启动一个事务会话。
- 在事务中执行对
orders
集合的插入操作和对inventory
集合的更新操作。 - 如果所有操作都成功,提交事务;否则,回滚事务。
客户端命令
startSession()
:启动一个新的会话,用于事务管理。session.startTransaction()
:开始一个事务。db.collection.insertOne()
:在orders
集合中插入一条新订单记录。db.collection.updateOne()
:根据订单中的产品信息,更新inventory
集合中相应产品的库存数量。session.commitTransaction()
:提交事务。session.abortTransaction()
:回滚事务。
错误处理机制
- 使用
try...catch
块捕获在事务执行过程中可能出现的任何错误,如网络故障、数据验证失败等。 - 在
catch
块中,调用session.abortTransaction()
回滚事务,以确保事务的原子性。
代码示例
// 启动一个新的会话
const session = db.getMongo().startSession();
session.startTransaction();
try {
// 假设新订单数据
const newOrder = {
orderId: "12345",
products: [
{ productId: "product1", quantity: 5 },
{ productId: "product2", quantity: 3 }
]
};
// 在orders集合中插入新订单记录
db.orders.insertOne(newOrder, { session });
// 根据订单中的产品信息,更新inventory集合中的库存数量
newOrder.products.forEach(product => {
db.inventory.updateOne(
{ productId: product.productId },
{ $inc: { stock: -product.quantity } },
{ session }
);
});
// 提交事务
session.commitTransaction();
print("事务提交成功");
} catch (e) {
// 捕获错误并回滚事务
session.abortTransaction();
print("事务回滚,错误信息:" + e);
} finally {
// 结束会话
session.endSession();
}
上述代码实现了在orders
和inventory
两个集合上的事务操作,通过try...catch
机制处理可能出现的错误,确保了事务的原子性。