最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

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

來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-09 06:54:43
文檔

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

關(guān)于MySQL涉及鎖的問題詳解:如何并發(fā)的訪問數(shù)據(jù)庫呢?答案就是加鎖。推薦:《mysql視頻教程》接下來說一下,數(shù)據(jù)庫的鎖機制,數(shù)據(jù)庫中都有哪些鎖? 首先呢,鎖是一種并發(fā)控制技術(shù),鎖是用來在多個用戶同時訪問同一個數(shù)據(jù)的時候保護數(shù)據(jù)的。有2種基本的鎖類型: 共享(S)鎖:多個事務(wù)可
推薦度:
導(dǎo)讀關(guān)于MySQL涉及鎖的問題詳解:如何并發(fā)的訪問數(shù)據(jù)庫呢?答案就是加鎖。推薦:《mysql視頻教程》接下來說一下,數(shù)據(jù)庫的鎖機制,數(shù)據(jù)庫中都有哪些鎖? 首先呢,鎖是一種并發(fā)控制技術(shù),鎖是用來在多個用戶同時訪問同一個數(shù)據(jù)的時候保護數(shù)據(jù)的。有2種基本的鎖類型: 共享(S)鎖:多個事務(wù)可

如何并發(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鎖被釋放才能對該頁進(jìn)行訪問;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)生死鎖的四個必要條件:

  互斥條件:一個資源每次只能被一個進(jìn)程使用。

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

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

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

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

預(yù)防死鎖

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

1)破壞互斥條件

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

2)破壞不可剝奪條件

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

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

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

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

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

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

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

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

解除死鎖

  1)從死鎖進(jìn)程處剝奪資源;

  2)終止部分或全部進(jìn)程;

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

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

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

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

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

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

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

  2、行級鎖:僅對指定的記錄進(jìn)行加鎖,這樣其他進(jìn)程還是可以對同一個表中的其他記錄進(jìn)行操作。特點:開銷大,加鎖慢;會出現(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)前版本信息進(jìn)行比對,如果提交的數(shù)據(jù)版本號大于數(shù)據(jù)庫表當(dāng)前版本號,則予以更新,否則認(rèn)為是過期數(shù)據(jù),不得不重新讀取該對象并作出更改。

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

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

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

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

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

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

關(guān)于MySQL涉及鎖的問題詳解:如何并發(fā)的訪問數(shù)據(jù)庫呢?答案就是加鎖。推薦:《mysql視頻教程》接下來說一下,數(shù)據(jù)庫的鎖機制,數(shù)據(jù)庫中都有哪些鎖? 首先呢,鎖是一種并發(fā)控制技術(shù),鎖是用來在多個用戶同時訪問同一個數(shù)據(jù)的時候保護數(shù)據(jù)的。有2種基本的鎖類型: 共享(S)鎖:多個事務(wù)可
推薦度:
標(biāo)簽: 問題 涉及 mysql
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top