面试题答案
一键面试1. 从存储引擎底层数据结构和操作逻辑看事务持久化中多文档数据一致性保证
- B - tree结构基础:在WiredTiger存储引擎中,B - tree用于索引文档数据。每个节点包含键值对以及指向子节点的指针。当执行事务涉及多个文档修改时,这些修改会反映在对应的B - tree节点上。
- 日志记录(Write - Ahead Log,WAL):
- 操作逻辑:在对B - tree节点进行实际修改前,先将事务操作记录到WAL中。这是一种预写式日志机制,确保即使系统崩溃,事务也能恢复。例如,当一个事务要修改两个文档的数据,这两个文档在B - tree中的相关节点修改操作会先记录到WAL。
- 一致性保证:通过WAL,存储引擎可以在事务提交时,按照日志记录的顺序重新应用操作,保证多个文档修改的一致性。如果在事务执行过程中发生故障,系统重启后可以根据WAL中的记录回滚未完成的事务,避免部分修改生效导致的数据不一致。
- Checkpoint机制:
- 操作逻辑:定期创建Checkpoint,它会将内存中已修改的数据(包括B - tree节点的修改)刷新到磁盘。Checkpoint会记录当前系统的状态,包括哪些事务已提交,哪些未提交。
- 一致性保证:在系统崩溃恢复时,存储引擎可以从最近的Checkpoint开始,结合WAL中的记录,重新应用已提交事务的操作,跳过未提交事务的操作,从而保证多个文档之间数据的一致性。
2. 面对复杂事务操作时存储引擎的协同保证
- 嵌套事务:
- 操作逻辑:在存储引擎层面,嵌套事务可以看作是一系列具有层次关系的操作集合。当一个嵌套事务开始时,存储引擎会为其分配一个唯一的事务标识,并在WAL中记录嵌套事务的起始点。内部嵌套事务的操作同样会记录到WAL,并且与外层事务的日志记录相关联。
- 一致性和持久化保证:提交嵌套事务时,存储引擎会确保从最内层到最外层事务的所有操作都按照顺序持久化。只有当所有内层嵌套事务都成功提交后,外层事务才能提交。如果任何一个内层事务失败,整个嵌套事务会回滚,通过WAL记录的操作逆序回滚,保证数据一致性。
- 分布式事务:
- 操作逻辑:对于分布式事务,MongoDB使用两阶段提交(2PC)协议。存储引擎在不同节点间协同工作,协调者节点负责管理事务的各个阶段。在准备阶段,每个涉及的节点(存储引擎)对本地数据进行预检查和预操作,并将结果返回给协调者。在提交阶段,只有当所有节点都准备好提交时,协调者才会通知各节点正式提交事务,否则通知各节点回滚。
- 一致性和持久化保证:通过2PC协议,存储引擎确保所有参与分布式事务的节点要么都提交事务,要么都回滚事务,从而保证整个分布式系统中数据的一致性。同时,每个节点的存储引擎通过本地的WAL和Checkpoint机制保证本地数据的持久化,进一步确保分布式事务的一致性和持久化。