MST

星途 面试题库

面试题:MongoDB中事务的ACID特性之一致性如何体现

请阐述在MongoDB事务场景下,一致性(Consistency)特性是怎样具体实现和体现的,可结合具体的操作或场景举例说明。
47.2万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

1. MongoDB事务一致性概述

MongoDB通过多文档事务确保跨多个文档、集合甚至数据库操作的一致性。事务一致性保证了事务中的所有操作要么全部成功,要么全部失败,确保数据状态在事务前后保持一致。

2. 实现方式

  • 日志记录:MongoDB使用预写式日志(WAL)记录事务中的操作。在事务执行过程中,对数据的修改首先写入日志,这确保了即使系统崩溃,也能根据日志恢复到事务执行前的状态。
  • 两阶段提交(2PC):在提交事务时,MongoDB使用两阶段提交协议。第一阶段,协调者(通常是主节点)向所有参与者(副本集成员)发送准备消息,参与者检查是否可以提交事务并回复。第二阶段,如果所有参与者都准备好,协调者发送提交消息,否则发送回滚消息。

3. 具体场景举例

假设我们有一个银行转账场景,从账户A向账户B转账100元。在MongoDB中,账户数据可能存储在不同文档甚至不同集合中。

// 开启事务
const session = client.startSession();
session.startTransaction();

try {
    // 从账户A减去100元
    const accountA = await session.collection('accounts').findOneAndUpdate(
        { accountId: 'A' },
        { $inc: { balance: -100 } },
        { session, returnOriginal: false }
    );

    // 向账户B增加100元
    const accountB = await session.collection('accounts').findOneAndUpdate(
        { accountId: 'B' },
        { $inc: { balance: 100 } },
        { session, returnOriginal: false }
    );

    // 提交事务
    await session.commitTransaction();
} catch (error) {
    // 事务失败,回滚
    await session.abortTransaction();
} finally {
    session.endSession();
}

在这个例子中,如果从账户A减去100元成功,但向账户B增加100元失败,整个事务会回滚,账户A的余额不会减少,确保了数据的一致性。如果两个操作都成功,事务提交,数据状态更新为转账后的正确状态。