面试题答案
一键面试1. 并发事务场景下确保索引一致性与事务原子性不冲突的机制
- 锁机制:MongoDB使用多粒度锁(如文档级锁、集合级锁等)。在并发事务中,当一个事务对文档进行操作时,会获取相应的锁。这就避免了多个事务同时修改同一文档或集合,从而防止索引因并发修改而出现不一致。例如,一个事务要更新文档,它先获取文档级锁,在事务完成前,其他事务无法修改该文档,也就不会干扰索引的一致性。
- WiredTiger存储引擎:MongoDB默认使用WiredTiger存储引擎,它支持多版本并发控制(MVCC)。MVCC允许读操作不阻塞写操作,写操作也不阻塞读操作。在事务场景下,每个事务有自己的视图版本,读取的数据是基于该版本的。这使得索引的读取和更新可以在不同事务间并行进行,而不会因为并发读取和更新索引而导致不一致。
2. 事务提交过程中索引的处理机制
- 日志记录:在事务执行过程中,MongoDB会记录操作日志(Write-Ahead Log,WAL)。当事务提交时,先将事务的日志写入磁盘。日志中包含了对文档的修改以及相应的索引更新操作。这保证了即使在提交过程中出现故障,也可以通过重放日志来恢复索引的一致性。
- 原子性提交:MongoDB会确保事务中的所有操作(包括索引更新)要么全部成功提交,要么全部失败。当事务提交时,会按照日志记录的顺序依次更新索引。由于日志记录了完整的操作序列,所以可以保证索引的一致性。例如,如果一个事务插入了一条文档并更新了相关索引,提交时这些操作作为一个整体执行,要么都完成,要么都不完成。
3. 事务回滚过程中索引的处理机制
- 反向操作:当事务回滚时,MongoDB会根据日志记录的操作进行反向操作。如果事务中插入了文档并更新了索引,回滚时会删除该文档,并反向更新索引,恢复到事务开始前的状态。例如,删除文档时,会从相关索引中移除该文档的索引项,确保索引与数据的一致性。
- 回滚日志:与提交过程类似,回滚操作也会记录日志,以确保回滚操作的原子性和可靠性。如果在回滚过程中出现故障,可以通过回滚日志来继续完成回滚操作,保证索引回到事务开始前的正确状态。