官方定義如下:兩個事務都持有對方需要的鎖,并且在等待對方釋放,并且雙方都不會釋放自己的鎖。
在尼勒克等地區,都構建了全面的區域性戰略布局,加強發展的系統性、市場前瞻性、產品創新能力,以專注、極致的服務理念,為客戶提供網站建設、網站設計 網站設計制作按需制作,公司網站建設,企業網站建設,品牌網站設計,成都營銷網站建設,成都外貿網站建設公司,尼勒克網站建設費用合理。
這個就好比你有一個人質,對方有一個人質,你們倆去談判說換人。你讓對面放人,對面讓你放人。
看到這里,也許你會有這樣的疑問,事務和談判不一樣,為什么事務不能使用完鎖之后立馬釋放呢?居然還要操作完了之后一直持有鎖?這就涉及到 MySQL 的并發控制了。
MySQL的并發控制有兩種方式,一個是 MVCC,一個是兩階段鎖協議。那么為什么要并發控制呢?是因為多個用戶同時操作 MySQL 的時候,為了提高并發性能并且要求如同多個用戶的請求過來之后如同串行執行的一樣( 可串行化調度 )。具體的并發控制這里不再展開。咱們繼續深入討論兩階段鎖協議。
官方定義:
對應到 MySQL 上分為兩個階段:
就是說呢,只有遵循兩段鎖協議,才能實現 可串行化調度 。
但是兩階段鎖協議不要求事務必須一次將所有需要使用的數據加鎖,并且在加鎖階段沒有順序要求,所以這種并發控制方式會形成死鎖。
MySQL有兩種死鎖處理方式:
由于性能原因,一般都是使用死鎖檢測來進行處理死鎖。
死鎖檢測的原理是構建一個以事務為頂點、鎖為邊的有向圖,判斷有向圖是否存在環,存在即有死鎖。
檢測到死鎖之后,選擇插入更新或者刪除的行數最少的事務回滾,基于 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段來判斷。
MySQL如何處理死鎖
鎖是需要事務結束后才釋放的。
一個是 MVCC,一個是兩階段鎖協議。
為什么要并發控制呢?是因為多個用戶同時操作 MySQL 的時候,為了提高并發性能并且要求如同多個用戶的請求過來之后如同串行執行的一樣(為了解決臟讀、不可重復讀、幻讀)
官方定義:
兩階段鎖協議是指所有事務必須分兩個階段對數據加鎖和解鎖,在對任何數據進行讀、寫操作之前,事務首先要獲得對該數據的封鎖;在釋放一個封鎖之后,事務不再申請和獲得任何其他封鎖。
對應到 MySQL 上分為兩個階段:
但是兩階段鎖協議不要求事務必須一次將所有需要使用的數據加鎖(innodb在需要的索引列數據才鎖行),并且在加鎖階段沒有順序要求,所以這種并發控制方式會形成死鎖。
MySQL有兩種死鎖處理方式:
死鎖檢測 (默認開啟)
死鎖檢測的原理是構建一個以事務為頂點、鎖為邊的有向圖,判斷有向圖是否存在環,存在即有死鎖。
回滾
檢測到死鎖之后,選擇插入更新或者刪除的行數最少的事務回滾,基于 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段來判斷。
收集死鎖信息:
減少死鎖:
死鎖解決:
鎖是計算機協調多個進程或線程并發訪問某一資源的機制,在數據庫中,除傳統的計算資源(CPU、RAM、I/O)爭用外,數據也是一種供許多用戶共享的資源,如何保證數據并發訪問的一致性,有效性是所有數據庫必須解決的一個問題,鎖沖突也是影響數據庫并發訪問性能的一個重要因素,從這個角度來說,鎖對數據庫而言是尤其重要,也更加復雜。MySQL中的鎖,按照鎖的粒度分為:1、全局鎖,就鎖定數據庫中的所有表。2、表級鎖,每次操作鎖住整張表。3、行級鎖,每次操作鎖住對應的行數據。
全局鎖就是對整個數據庫實例加鎖,加鎖后整個實例就處于只讀狀態,后續的DML的寫語句,DDL語句,已經更新操作的事務提交語句都將阻塞。其典型的使用場景就是做全庫的邏輯備份,對所有的表進行鎖定,從而獲取一致性視圖,保證數據的完整性。但是對數據庫加全局鎖是有弊端的,如在主庫上備份,那么在備份期間都不能執行更新,業務會受影響,第二如果是在從庫上備份,那么在備份期間從庫不能執行主庫同步過來的二進制日志,會導致主從延遲。
解決辦法是在innodb引擎中,備份時加上--single-transaction參數來完成不加鎖的一致性數據備份。
添加全局鎖: flush tables with read lock; 解鎖 unlock tables。
表級鎖,每次操作會鎖住整張表.鎖定粒度大,發送鎖沖突的概率最高,并發讀最低,應用在myisam、innodb、BOB等存儲引擎中。表級鎖分為: 表鎖、元數據鎖(meta data lock, MDL)和意向鎖。
表鎖又分為: 表共享讀鎖 read lock、表獨占寫鎖write lock
語法: 1、加鎖 lock tables 表名 ... read/write
2、釋放鎖 unlock tables 或者關閉客戶端連接
注意: 讀鎖不會阻塞其它客戶端的讀,但是會阻塞其它客戶端的寫,寫鎖既會阻塞其它客戶端的讀,又會阻塞其它客戶端的寫。大家可以拿一張表來測試看看。
元數據鎖,在加鎖過程中是系統自動控制的,無需顯示使用,在訪問一張表的時候會自動加上,MDL鎖主要作用是維護表元數據的數據一致性,在表上有活動事務的時候,不可以對元數據進行寫入操作。為了避免DML和DDL沖突,保證讀寫的正確性。
在MySQL5.5中引入了MDL,當對一張表進行增刪改查的時候,加MDL讀鎖(共享);當對表結構進行變更操作時,加MDL寫鎖(排他).
查看元數據鎖:
select object_type,object_schema,object_name,lock_type,lock_duration from performance_schema_metadata_locks;
意向鎖,為了避免DML在執行時,加的行鎖與表鎖的沖突,在innodb中引入了意向鎖,使得表鎖不用檢查每行數據是否加鎖,使用意向鎖來減少表鎖的檢查。意向鎖分為,意向共享鎖is由語句select ... lock in share mode添加。意向排他鎖ix,由insert,update,delete,select。。。for update 添加。
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from performance_schema.data_lock;
行級鎖,每次操作鎖住對應的行數據,鎖定粒度最小,發生鎖沖突的概率最高,并發讀最高,應用在innodb存儲引擎中。
innodb的數據是基于索引組織的,行鎖是通過對索引上的索引項加鎖來實現的,而不是對記錄加的鎖,對于行級鎖,主要分為以下三類:
1、行鎖或者叫record lock記錄鎖,鎖定單個行記錄的鎖,防止其他事物對次行進行update和delete操作,在RC,RR隔離級別下都支持。
2、間隙鎖Gap lock,鎖定索引記錄間隙(不含該記錄),確保索引記錄間隙不變,防止其他事物在這個間隙進行insert操作,產生幻讀,在RR隔離級別下都支持。
3、臨鍵鎖Next-key-lock,行鎖和間隙鎖組合,同時鎖住數據,并鎖住數據前面的間隙Gap,在RR隔離級別下支持。
innodb實現了以下兩種類型的行鎖
1、共享鎖 S: 允許一個事務去讀一行,阻止其他事務獲得相同數據集的排他鎖。
2、排他鎖 X: 允許獲取排他鎖的事務更新數據,阻止其他事務獲得相同數據集的共享鎖和排他鎖。
insert 語句 排他鎖 自動添加的
update語句 排他鎖 自動添加
delete 語句 排他鎖 自動添加
select 正常查詢語句 不加鎖 。。。
select 。。。lock in share mode 共享鎖 需要手動在select 之后加lock in share mode
select 。。。for update 排他鎖 需要手動在select之后添加for update
默認情況下,innodb在repeatable read事務隔離級別運行,innodb使用next-key鎖進行搜索和索引掃描,以防止幻讀。
間隙鎖唯一目的是防止其它事務插入間隙,間隙鎖可以共存,一個事務采用的間隙鎖不會阻止另一個事務在同一間隙上采用的間隙鎖。
當前標題:mysql怎么釋放鎖 mysql排他鎖釋放
網頁鏈接:http://vcdvsql.cn/article24/hhpgce.html
成都網站建設公司_創新互聯,為您提供虛擬主機、靜態網站、軟件開發、網站收錄、關鍵詞優化、定制網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯