mongo锁机制简介
背景
锁机制要解决的是并发请求下资源分配的问题,对于数据库来说,就是并发的读写。锁机制要处理两个问题,一个是最基本的,要保证写的原子性,否则会在并发情况下产生混乱。另一个是提高并发效率。
锁的类型
锁加在被请求的资源上,用于标明资源当前的状态。从能否被多个用户共享的角度来说,锁有两种类型:用于读的共享锁(S)和用于写的排它锁(X)。
每一个对资源的请求,都需要首先确保请求的资源上有相应的锁。比如对某个文档的读请求,要先给它加上用于读的S锁,被S锁住的资源不能再加上X锁,确保读的过程中资源不会被改写。同时这个S锁本身是共享的,它锁住的资源可以被其他并发的读请求获取。而写锁是排他的,同一个资源的写锁,只能被单个的请求持有。这种机制即保证了写的原子性(X锁排他),又保证了读的并发性(S锁共享)。
上面这种处理并发的方式,叫做悲观并发控制(pessimistic concurrency control),也叫悲观锁。每一个读写请求都要检查相应的锁,有了对应的锁才进行后续操作,严格的杜绝了数据的混乱。同时悲观锁的代价是要消耗CPU资源去做锁相关的操作,请求可能会互相阻塞,甚至发生死锁。比如两个写请求A和B同时请求a、b两个资源。如果A给a加上了锁,还没给b加上锁;B给b加上了锁,还没有给a加上锁,就会导致死锁。