mongo并发与锁
MongoDB 使用哪种类型的锁定?
除了用于读取的共享 (S) 锁定模式和用于写入操作的独占 (X) 锁定模式之外,意图共享 (IS) 和意图独占 (IX) 模式表示使用更细粒度的锁来读取或写入资源的意图。按一定粒度锁定时,所有更高级别都使用意向锁
例如,当锁定一个集合进行写入(使用模式 X)时,相应的数据库锁和全局锁都必须以意向独占 (IX) 模式锁定。单个数据库可以同时以 IS 和 IX 模式锁定,但独占 (X) 锁不能与任何其他模式共存,共享 (S) 锁只能与意向共享 (IS) 锁共存。
锁是公平的,读取和写入的锁请求都会按顺序排队。然而,为了优化吞吐量,批准一个锁请求时,也会同时批准所有其他兼容的锁请求,这可能会导致在执行冲突的锁请求之前释放锁。例如,当一个 X 锁刚被释放并且冲突队列包含这些锁:
IS → IS → X → X → S → IS
某些常见客户端操作会采用哪些锁?
下表列出一些操作及其为文档级锁定存储引擎使用的锁类型:
操作
|
Database
|
Collection
|
---|---|---|
发出查询
|
r (意向共享) |
r (意向共享) |
Insert data
|
w (意向独占) |
w (意向独占) |
删除数据
|
w (意向独占) |
w (意向独占) |
Update data
|
w (意向独占) |
w (意向独占) |
执行聚合
|
r (意向共享) |
r (意向共享) |
创建索引(前景)
|
W (独占) |
|
创建索引(背景)
|
w (意向独占) |
w (意向独占) |
listCollections
|
r (意向共享) |
|
map-reduce
|
W (独占)和 R (共享) |
w (意向独占)和 r (意向共享) |