<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        關于MySQL涉及鎖的問題詳解

        來源:懂視網 責編:小采 時間:2020-11-09 06:54:43
        文檔

        關于MySQL涉及鎖的問題詳解

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

        如何并發的訪問數據庫呢?答案就是加鎖

        推薦:《mysql視頻教程》

        接下來說一下,數據庫的鎖機制,數據庫中都有哪些鎖?

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

        有2種基本的鎖類型:

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

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

        按鎖的機制

        既然使用了鎖,就有出現死鎖的可能。

        產生死鎖的四個必要條件:

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

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

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

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

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

        預防死鎖

        預防死鎖的發生只需要破壞死鎖產生的四個必要條件之一即可。

        1)破壞互斥條件

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

        2)破壞不可剝奪條件

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

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

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

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

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

        4)破壞環路等待條件

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

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

        解除死鎖

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

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

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

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

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

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

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

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

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

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

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

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

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

        樂觀鎖和悲觀鎖的概念,實現方式和使用場景

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

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

        一個典型的依賴數據庫的悲觀鎖調用:

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

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

          悲觀所可能會造成加鎖的時間很長,并發行不好,特別是長事務,影響系統的整體性能。

          悲觀所的實現方式:

            悲觀鎖,也是基于數據庫的鎖機制實現。傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖、寫鎖等,都是在做操作之前先上鎖。

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

          樂觀鎖加鎖的時間要比悲觀鎖短,大大提升了大并發量下的系統整體性能表現。

          樂觀鎖的實現方式:

            1、大多是基于數據版本(version)記錄機制實現,需要為每一行數據增加一個版本標識(也就是每一行數據多一個字段version),每次更新數據都要更新對應的版本號+1。

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

            2、使用時間戳來實現

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

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

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

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

        文檔

        關于MySQL涉及鎖的問題詳解

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

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产在线a免费观看| 一级毛片aa高清免费观看| 4444www免费看| 亚洲视频在线免费播放| 久久A级毛片免费观看| 亚洲AV无码久久精品成人| 久久免费国产视频| 亚洲精品偷拍无码不卡av| 国产免费女女脚奴视频网| 亚洲日本久久久午夜精品| 国产乱弄免费视频| 无套内谢孕妇毛片免费看看| 亚洲男人的天堂在线va拉文| 国产午夜无码片免费| 亚洲欧洲在线观看| 国产v精品成人免费视频400条| 亚洲A∨精品一区二区三区| ww在线观视频免费观看w| 久久亚洲国产伦理| 黄页网站在线观看免费高清| 亚洲精品无码国产片| 亚洲成a人片在线观看日本麻豆 | 亚洲无线码在线一区观看| 97人妻精品全国免费视频 | 国产yw855.c免费视频| 亚欧国产一级在线免费| 亚洲精品国产美女久久久| 久久国产精品成人片免费| 亚洲精品无码永久在线观看男男| 在线a级毛片免费视频| 色妞www精品视频免费看| 亚洲AV无码国产丝袜在线观看| 久久国产乱子伦精品免费不卡| 久久久亚洲欧洲日产国码aⅴ| 国产精品成人免费一区二区| 国产亚洲精品精品精品| 亚洲福利在线视频| 国产成人精品男人免费| 免费国产在线视频| 亚洲成aⅴ人片久青草影院按摩| 亚洲日韩中文字幕日韩在线|