MongoDB 允许多个客户端读写相同的数据。为了确保一致性,MongoDB 使用锁定和并发控制
来防止客户端同时修改相同的数据。对单个文档的写入要么完整发生,要么根本不发生,并且客户端始终看到一致的数据。
1、MongoDB 如何管理并发?
MongoDB 使用读写锁,允许并发读者共享访问资源,例如数据库或集合。
WiredTiger 使用乐观并发控制。 WiredTiger 仅在全局、数据库和集合级别使用意图锁。当存储引擎检测到两个操作之间的冲突时,会引发写入冲突,导致 MongoDB 透明地重试该操作。
2、MongoDB 使用什么类型的锁定?
MongoDB 使用多粒度锁定,允许操作锁定在全局、数据库或集合级别,并允许各个存储引擎在集合级别以下(例如,在 WiredTiger 中的文档级别)实现自己的并发控制。
除了用于读取的共享 (S) 锁定模式和用于写入操作的独占 (X) 锁定模式之外,意向共享 (IS) 和意向独占 (IX) 模式表示使用更细粒度的锁读取或写入资源的意向. 当以特定粒度锁定时,所有更高级别都使用意向锁锁定。
例如,当锁定一个集合用于写入(使用模式 X)时,相应的数据库锁和全局锁都必须以意向排他 (IX) 模式锁定。单个数据库可以同时在 IS 和 IX 模式下加锁,但排他(X)锁不能与任何其他模式共存,共享(S)锁只能与意向共享(IS)锁共存。
锁是公平的,读写的锁请求按顺序排队。但是,为了优化吞吐量,当一个锁请求被授予时,所有其他兼容的锁请求将同时被授予