(三)mongodb (数据库锁的机制)

乐观锁与悲观锁

乐观锁:

    假设总是最好的情况

    当其它线程去读写数据的时候,总认为不会发生问题,因此没有上锁,

    直到数据修改完,准备提交的时候,才会上锁,完成后释放。

悲观锁:

    假设总是最坏的情况

    当其它线程去读写数据的时候,总认为别的线程会对数据进行修改,因此都会上锁,

    每次只允许一个线程对数据进行修改,其它线程会被阻塞挂起,

    从数据开始修改就将数据锁住,直到更改完才释放锁,

 排它锁与共享锁

排它锁:

    写锁(X锁)

    在某一个时刻只能被某一个线程占有,其它线程必须等待锁释放之后才能获取锁

共享锁:

    读锁(S锁)

    允许多个线程同时获取一个锁

活锁与死锁

活锁:

    事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。

    T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。

    T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求……

    T2有可能永远等待,这就是活锁的情形

    

线程A和B都需要过桥(都需要使用进程),而都礼让不走(那到的系统优先级相同,都认为不是自己优先级高),就这么僵持下去.(很绅士,互相谦让)

解决办法:采用先来先服务

死锁:

    互相等待(拿不到资源互相占用资源)

    a1已经封锁了数据R1,正请求对数据R2封锁,

    a2已经封锁了数据R2,正请求对数据R1封锁,

解决办法:一次封锁法,每个事务必须一次将所有要使用的数据全部加锁

饿锁:

  这是个独木桥(单进程),桥上只能走一个人,B来到时A在桥上,B等待;
        而此时比B年龄小的C来了,B让C现行(A走完后系统把进程分给了C),
        C上桥后,D又来了,B又让D现行(C走完后系统把进程分个了D)
        以此类推B一直是等待状态.

mongodb锁的机制

Mongodb使用读写锁来允许很多用户同时去读一个资源,比如数据库或者集合。读采用的是共享锁,写采用的是排它锁。

乐观锁的实现机制

 (1)版本号机制

 (2)CAS算法

做一个优秀的程序媛
原文地址:https://www.cnblogs.com/oytt/p/13630916.html