• (三)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算法

    做一个优秀的程序媛
  • 相关阅读:
    react系列(二)高阶组件-HOC
    【译】2分钟介绍Rx
    react系列(一)JSX语法、组件概念、生命周期介绍
    react系列(零)安装
    函数节流和函数防抖
    观察者模式和发布订阅模式(下)
    观察者模式和发布订阅模式(上)
    java学习第二天 20207/7
    2020/7/6博客日报Java的开始--pthread的安装
    node.js实现excel导出/exceljs实现导出
  • 原文地址:https://www.cnblogs.com/oytt/p/13630916.html
Copyright © 2020-2023  润新知