久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      關(guān)于MySQL涉及鎖的問題詳解

      如何并發(fā)的訪問數(shù)據(jù)庫呢?答案就是加鎖。

      推薦:《mysql視頻教程》

      接下來說一下,數(shù)據(jù)庫的鎖機制,數(shù)據(jù)庫中都有哪些鎖?

        首先呢,鎖是一種并發(fā)控制技術(shù),鎖是用來在多個用戶同時訪問同一個數(shù)據(jù)的時候保護數(shù)據(jù)的。

      有2種基本的鎖類型:

        共享(S)鎖:多個事務(wù)可封鎖一個共享頁;任何事務(wù)都不能修改該頁;通常是該頁被讀取完畢,S鎖立即被釋放。在執(zhí)行select語句的時候需要給操作對象(表或一些記錄)加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒有,則可以加共享鎖(一個對象上可以加N個共享鎖),否則不行。共享鎖通常在執(zhí)行完select語句之后被釋放,當(dāng)然也可能是在事務(wù)結(jié)束(包括正常結(jié)束和異常結(jié)束)的時候被釋放,主要取決與數(shù)據(jù)庫所設(shè)置的事務(wù)隔離級別。

        排它(X)鎖:僅允許一個事務(wù)封鎖此頁;其他任何事務(wù)必須等到X鎖被釋放才能對該頁進行訪問;X鎖一直到事務(wù)結(jié)束才能被釋放。執(zhí)行insert、update、delete語句的時候需要給操作的對象加排它鎖,在加排他鎖之前必須確認(rèn)該對象上沒有其他任何鎖,一旦加上排它鎖之后,就不能再給這個對象加其他任何鎖。排它鎖的釋放通常是在事務(wù)結(jié)束的時候(當(dāng)然也有例外,就是在數(shù)據(jù)庫事務(wù)隔離級別被設(shè)置為Read Uncommitted(讀未提交數(shù)據(jù))的時候,這種情況下排他鎖會在執(zhí)行完更新操作之后被釋放,而不是在事務(wù)結(jié)束的時候)。

      按鎖的機制

      既然使用了鎖,就有出現(xiàn)死鎖的可能。

      產(chǎn)生死鎖的四個必要條件:

        互斥條件:一個資源每次只能被一個進程使用。

        請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。

        不可剝奪條件:進程已獲得的資源,在未使用完之前,不能強行剝奪。

        環(huán)路等待條件:若干個進程之間形成一種頭尾相接的循環(huán)等待資源關(guān)系。

      只要系統(tǒng)發(fā)生了死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發(fā)生死鎖。

      預(yù)防死鎖

      預(yù)防死鎖的發(fā)生只需要破壞死鎖產(chǎn)生的四個必要條件之一即可。

      1)破壞互斥條件

        如果允許系統(tǒng)資源都能共享使用,則系統(tǒng)不會進入死鎖狀態(tài)。但有些資源根本不能同時訪問,如打印機等臨界資源只能互斥使用。所以破壞互斥條件而預(yù)防死鎖的方法不太可行,而且在有些場合應(yīng)該保護這種互斥性。

      2)破壞不可剝奪條件

        當(dāng)一個已保持了某些不可剝奪資源的進程,請求新的資源而得不到滿足時,它必須釋放已經(jīng)保持的所有資源,待以后需要時再重新申請。這意味著,一個進程已占有的資源會被暫時釋放,或者說是被剝奪了,或從而破壞了不可剝奪條件。

        該策略實現(xiàn)起來比較復(fù)雜,釋放已獲得的資源可能造成前一階段工作的失效,反復(fù)地申請和釋放資源會增加系統(tǒng)開銷,降低系統(tǒng)吞吐量。這種方法常用于狀態(tài)易于保存和恢復(fù)的資源,如CPU的寄存器及內(nèi)存資源,一般不能用于打印機之類的資源。

      3)破壞請求和保持的條件

        采用預(yù)先靜態(tài)分配方法,即進程在運行前一次申請完它所需要的全部資源,在它的資源為滿足前,不把它投入運行。一旦投入運行后,這些資源就一直歸它所有,也不再提出其他資源請求,這樣就可以保證系統(tǒng)不會發(fā)生死鎖。

        這種方式實現(xiàn)簡單,但缺點也顯而易見,系統(tǒng)資源被嚴(yán)重浪費,其中有些資源可能僅在運行初期或運行快結(jié)束時才使用,甚至根本不使用。而且還會導(dǎo)致“饑餓”現(xiàn)象,當(dāng)由于個別資源長期被其他進程占用時,將致使等待該資源的進程遲遲不能開始運行。

      4)破壞環(huán)路等待條件

        為了破壞環(huán)路等待條件,可采用順序資源分配法。首先給系統(tǒng)中的資源編號,規(guī)定每個進程,必須按編號遞增的順序請求資源,同類資源一次申請完。也就是說,只要進程提出申請分配資源Ri,則該進程在以后的資源申請種,只能申請編號大于Ri的資源。

        這種方法存在的問題時,編號必須相對穩(wěn)定,這就限制了新類型設(shè)備的增加;盡管在為資源編號時已考慮到大多數(shù)作業(yè)實際使用這些資源的順序,但也經(jīng)常會發(fā)生作業(yè)使用資源的順序與系統(tǒng)規(guī)定順序不同的情況,造成資源的浪費;此外,這種按規(guī)定次序申請資源的方法,也必然會給用戶的編程帶來麻煩。

      解除死鎖

        1)從死鎖進程處剝奪資源;

        2)終止部分或全部進程;

      MySQL鎖的粒度(即鎖的級別)

      MySQL各存儲引擎使用了三種類型(級別)的鎖定機制:行級鎖定、頁級鎖定和表級鎖定。

        1、表級鎖:直接鎖定整張表,在你鎖定期間,其他進程無法對該表進行寫操作。如果你是寫鎖,則其他進程則讀也不允許。特點:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖粒度最大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。

          MyISAM存儲引擎采用的是表級鎖。

          有兩種模式:表共享讀鎖和表獨占寫鎖。加讀鎖的命令:lock table 表名 read;  去掉鎖的命令:unlock tables。

          支持并發(fā)插入:支持查詢和插入操作并發(fā)運行(在表尾并發(fā)插入)。

          鎖調(diào)度機制:寫鎖優(yōu)先。一個進程請求某個MyISAM表的讀鎖,同時另一個進程也請求同一表的寫鎖,MySQL如何處理呢?答案是寫進程先獲得鎖。

        2、行級鎖:僅對指定的記錄進行加鎖,這樣其他進程還是可以對同一個表中的其他記錄進行操作。特點:開銷大,加鎖慢;會出現(xiàn)死鎖;鎖粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。

          InnoDB存儲引擎既支持行級鎖,也支持表級鎖,但默認(rèn)情況下是采用行級鎖。

        3、頁級鎖:一次鎖定相鄰的一組記錄。開銷和加鎖時間介于表鎖和行鎖之間;會出現(xiàn)死鎖;鎖定粒度介于表鎖和行鎖治安,并發(fā)度一般。

        最常用的處理多用戶并發(fā)訪問的方法是加鎖。當(dāng)一個用戶鎖定數(shù)據(jù)庫中的某個對象時,其他用戶就不能再訪問該對象。加鎖對并發(fā)訪問的影響體現(xiàn)在鎖的粒度上。比如,(表鎖)放在一個表上的鎖限制對整個表的并發(fā)訪問;(頁鎖)放在數(shù)據(jù)頁上的鎖限制了對整個數(shù)據(jù)頁的訪問;(行鎖)放在行上的鎖只限制對該行的并發(fā)訪問。

      樂觀鎖和悲觀鎖的概念,實現(xiàn)方式和使用場景

      鎖有兩種機制:悲觀鎖和樂觀鎖。

        悲觀鎖,鎖如其名,它對世界是悲觀的,它認(rèn)為別人訪問正在改變的數(shù)據(jù)的概率是很高的,所以從數(shù)據(jù)開始更改時就將數(shù)據(jù)鎖住,直到更改完成才釋放。

      一個典型的依賴數(shù)據(jù)庫的悲觀鎖調(diào)用:

        select * from account where name="Erica" for update

        這條SQL語句鎖定了account表中所有符合檢索條件(name="Erica")的記錄。本事務(wù)提交之前(事務(wù)提交時會釋放事務(wù)過程中的鎖),外界無法修改這些記錄。該語句用來鎖定特定的行(如果where子句,就是滿足where條件的那些行)。當(dāng)這些行被鎖定后,其他會話可以選擇這些行,但不能更改或刪除這些行,直到該語句的事務(wù)被commit語句或rollback語句結(jié)束終止。需要注意的是,select …for update要放到MySQL的事務(wù)種,即begin和commit中,否則不起作用。

        悲觀所可能會造成加鎖的時間很長,并發(fā)行不好,特別是長事務(wù),影響系統(tǒng)的整體性能。

        悲觀所的實現(xiàn)方式:

          悲觀鎖,也是基于數(shù)據(jù)庫的鎖機制實現(xiàn)。傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖、寫鎖等,都是在做操作之前先上鎖。

        樂觀鎖,它對世界比較樂觀,認(rèn)為別人訪問正在改變的數(shù)據(jù)的概率是很低的,所以直到修改完成準(zhǔn)備提交所作的修改到數(shù)據(jù)庫的時候才會將數(shù)據(jù)鎖住,當(dāng)你讀取以及改變該對象時并不加鎖,完成更改后釋放。樂觀鎖不能解決臟讀的問題。

        樂觀鎖加鎖的時間要比悲觀鎖短,大大提升了大并發(fā)量下的系統(tǒng)整體性能表現(xiàn)。

        樂觀鎖的實現(xiàn)方式:

          1、大多是基于數(shù)據(jù)版本(version)記錄機制實現(xiàn),需要為每一行數(shù)據(jù)增加一個版本標(biāo)識(也就是每一行數(shù)據(jù)多一個字段version),每次更新數(shù)據(jù)都要更新對應(yīng)的版本號+1。

          工作原理:讀出數(shù)據(jù)時,將此版本一同讀出,之后更新時,對此版本號加一。此時,將提交的數(shù)據(jù)的版本信息與數(shù)據(jù)庫表對應(yīng)記錄的當(dāng)前版本信息進行比對,如果提交的數(shù)據(jù)版本號大于數(shù)據(jù)庫表當(dāng)前版本號,則予以更新,否則認(rèn)為是過期數(shù)據(jù),不得不重新讀取該對象并作出更改。

          2、使用時間戳來實現(xiàn)

          同樣是在需要樂觀鎖控制的table中增加一個字段,名稱無所謂,字段類型使用時間戳(timestamp),和上面的version類似,也是在更新提交的時候檢查當(dāng)前數(shù)據(jù)庫中數(shù)據(jù)的時間戳和自己更新前取到的時間戳進行對比,如果一致則OK,否則就是版本沖突。

      悲觀鎖與樂觀鎖的適用場景:

        如果并發(fā)量不大,可以使用悲觀鎖解決并發(fā)問題;但如果系統(tǒng)的并發(fā)量非常大的話,悲觀所定會帶來非常大的性能問題,所以我們就要選擇樂觀鎖定的方法。現(xiàn)在大部分應(yīng)用都應(yīng)該是樂觀鎖的。

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號