面试题答案
一键面试冲突检测方式
- 文档级锁:在事务操作期间,MongoDB会对涉及的文档加锁。例如,当一个事务尝试修改某个文档时,会获取该文档的排它锁。若其他事务也试图修改同一文档,就会检测到冲突。因为同一时刻只有一个事务能持有文档的排它锁,其他事务请求该锁时会被拒绝,从而检测到冲突。
- 时间戳机制:MongoDB 4.0及更高版本引入了多文档事务,使用逻辑时钟(Logical Clocks)生成时间戳。事务开始时,会获取一个开始时间戳。在事务提交时,会检查自事务开始以来,相关数据是否被其他事务修改(通过比较时间戳)。如果数据的最后修改时间戳大于当前事务的开始时间戳,说明数据已被其他事务修改,检测到冲突。
关键组件或概念
- 存储引擎:MongoDB常用的存储引擎(如WiredTiger)负责实现文档级锁机制。WiredTiger提供了行级(文档级)的并发控制,通过锁管理器(Lock Manager)来管理锁的获取、释放以及冲突检测。
- 逻辑时钟:逻辑时钟为每个事务生成唯一时间戳,用于标识事务的开始顺序。它在整个集群中保持一致,是多文档事务中检测冲突的重要依据。逻辑时钟通过在副本集成员之间协调,确保时间戳的单调递增。
- 事务协调器:在多文档事务中,事务协调器负责跟踪事务状态、协调各参与节点(如副本集成员)的操作。事务协调器在提交阶段,会根据逻辑时钟和文档锁状态进行冲突检测,决定事务是否可以成功提交。