MongoDB面试指南之并发
并发
MongoDB允许多个客户机读取和写入相同的数据。为了确保一致性,它使用锁定和其他并发控制措施来防止多个客户端同时修改同一块数据。总之,这些机制保证了对单个文档的所有写操作要么全部发生,要么根本不发生,并且客户端永远不会看到不一致的数据视图。
MongoDB使用什么类型的锁?
MongoDB使用多粒度锁定[1],允许在全局、数据库或集合级别上锁定操作,并允许各个存储引擎在集合级别下实现自己的并发控制(例如,在WiredTiger的文档级别)。
MongoDB使用读写锁,允许并发的读写器共享对资源(如数据库或集合)的访问,但在MMAPv1中,只允许对单个写操作进行独占访问。
除了用于读操作的共享锁定模式和用于写操作的独占锁定模式外,意图共享(IS)和意图独占(IX)模式表示使用更细粒度的锁读写资源的意图。当锁定在某个粒度时,所有更高级别的锁都使用一个intent锁进行锁定。
例如,在为写入锁定集合时(使用模式X),必须在intent exclusive (IX)模式下锁定相应的数据库锁和全局锁。可以在IS和IX模式下同时锁定单个数据库,但是排他(X)锁不能与任何其他模式共存,共享(S)锁只能与意图共享(IS)锁共存。
锁是公平的,读写按顺序排队。然而,为了优化吞吐量,当一个请求被授予时,所有其他兼容的请求将同时被授予,这可能会在一个冲突请求之前释放它们。例如,考虑一个刚刚释放X锁的情况,其中冲突队列包含以下项目:
IS → IS → X → X → S → IS
复制代码
在严格的先进先出(FIFO)顺序中,只允许前两个IS模式。相反,MongoDB将实际授予所有的IS和S模式,一旦它们都耗尽,它将授予X,即使新的IS或S请求已在此期间排队。由于授予总是会将队列中的所有其他请求向前移动,所以任何请求都不可能出现饥饿。
在db.serverStatus() 和 db.currentOp() 输出中, 锁模式的含义如下:
Lock Mode | Description |
---|---|
R | 共享锁 Shared (S) lock |
W | 排它锁 Exclusive (X) lock |
r | 意向共享锁 Intent Shared (IS) lock |
w | 意向排它锁 Intent Exclusive (IX) lock |
在MongoDB中锁的粒度有多大
WiredTiger引擎