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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM