面试题答案
一键面试确保数据一致性的机制
- 两阶段提交(2PC):
- MongoDB在分布式事务处理中使用两阶段提交协议。在第一阶段(准备阶段),协调者(通常是主节点)会向所有参与事务的节点发送准备消息,各节点执行事务操作,但不提交。如果所有节点都成功准备,协调者进入第二阶段。
- 在第二阶段(提交阶段),协调者向所有节点发送提交消息,节点正式提交事务。如果有任何一个节点在准备阶段失败,协调者会向所有节点发送回滚消息,所有节点回滚事务,从而确保所有节点的数据一致性。
- 日志记录:
- MongoDB使用预写式日志(WAL)来记录所有的事务操作。即使在事务提交过程中发生故障,系统可以通过重放日志来恢复到事务一致的状态。在事务开始时,相关操作会被记录到日志中,只有当事务成功提交后,日志中的相关记录才会被标记为已提交。
- 读隔离:
- MongoDB提供了读隔离机制,如快照隔离。在事务执行过程中,读取操作会基于事务开始时的快照,这样可以避免读取到其他未提交事务的修改,保证事务内读取数据的一致性。
多文档事务在MongoDB 4.0及以上版本中的使用场景
- 金融交易场景:
- 例如银行转账,涉及从一个账户扣除金额并向另一个账户添加金额,这两个操作可能分布在不同的文档甚至不同的集合中。使用多文档事务可以确保这两个操作要么都成功,要么都失败,保证资金的一致性。
- 电子商务订单处理:
- 订单创建时,需要在订单集合中插入订单记录,同时在库存集合中减少相应商品的库存。多文档事务能够保证订单创建和库存扣减这两个操作的原子性,避免出现订单创建成功但库存未扣减或反之的情况。
- 复杂数据关系维护:
- 当数据模型存在复杂的关联关系,如社交网络中用户关系的更新,可能涉及到用户文档、好友关系文档等多个文档的修改。多文档事务可以确保这些关联数据的修改保持一致,避免数据不一致问题。