鎖機制是在計算機程式開發設計中用來解決多線程并發問題的解決方案之一。當然在資料庫管理中,資料也是一種多使用者多線程通路的共享資源。是以如何能夠保證多線程對于資料共享資源通路的一緻性、有效性等問題是資料庫需要解決的問題之一,而對于鎖的控制就是影響到資料庫通路效率的關鍵之一。
是以鎖機制對于資料庫是非常重要而且又複雜的操作之一。
在MySQL中,鎖機制按照鎖的粒度可以分為如下幾種。
- 全局鎖:鎖定的是資料庫中所有的表
- 表級鎖:鎖定被操作的某個資料表的整個表
- 行級鎖:鎖定被操作的某一行資料
下面我們就來分别介紹一下這幾種鎖的操作。
全局鎖
全局鎖毋庸置疑,就是對整個的資料庫執行個體進行加鎖操作,當進行加鎖操作之後,整個的資料庫執行個體就處于一個隻讀的狀态,後續的DML的寫語句,DDL語句,已經更新操作的事務送出語句都将被阻塞。
全局鎖最經典的場景就是對資料進行全庫備份的時候,要對所有的資料表進行鎖定,這樣可以保證在備份時刻的資料的完整性。
那麼為什麼要進行全局加鎖呢?
如果在我們進行資料備份的時候,還有資料在寫入,或者是更新,這就會導緻某些資料的不一緻。無法保證資料的完整性。
當我們對資料進行全局加鎖操作之後,對于所有的更新、插入、删除操作都是阻塞的,使用者可以正常讀取資料,但是無法插入資料,這就讓資料庫處于一個隻讀的狀态。這樣可以保證在資料備份的過程中,資料庫中的資料不會發生變化,這樣就可以保證資料庫資料的一緻性和完整性。
使用文法
1、全局加鎖
flush tables with read lock;
2、進行資料備份
mysqldump -uroot -p123456 zhsq >zhsq.sql
3、釋放鎖
unlock tables;
特點
由于資料是全局的操作,是一個比較大的操作,是以會出現如下的一些問題。
- 如果在主庫上進行備份,那麼在整個的備份期間,都不能對資料進行更新操作,這樣的話整個的業務系統都會停機。
- 如果是在從庫上進行備份,那麼在備份期間從庫就不能同步主庫的日志檔案,就會導緻資料延遲。
在InnoDB引擎中,MySQL提供如下的操作來完成不加鎖資料一緻性備份。
mysqldump --single-transaction -uroot –p123456 zhsq > zhsq.sql
表級鎖
表級鎖,就是在每次操作的時候,鎖住将要操作的整個表,鎖粒度還是比較大的,容易發生鎖沖突,在MyISAM、InnoDB、BDB等引擎中都有所支援。
主要的表級鎖分類有如下幾種。
- 表鎖
- 中繼資料鎖
- 意向鎖
其中表鎖又可以分為如下兩種
- 表共享讀鎖
- 表獨占寫鎖
其用法如下
// 加鎖操作
lock table 表明 read/write
// 釋放鎖
unlock tables /斷開連接配接
總結
讀鎖不會阻塞其他用戶端的讀操作,但會阻塞寫操作;寫鎖會阻塞其他用戶端的讀操作,也會阻塞其他用戶端的寫操作。
行級鎖
行級鎖,對于每次操作都是鎖住了操作的某一行資料,是所有鎖中粒度最小的,是以發生沖突的機率也比較低,并發支援也是最高的,主要應用在InnoDB引擎中。
由于在InnoDB中的資料是基于索引進行組織的,是以行級鎖是通過對索引的索引項加鎖來實作鎖定操作的,而不是對某條記錄進行加鎖,是以對于行級鎖,一般可以分為如下幾種。
- 行鎖:鎖定單個的行記錄,防止了其他事務操作對于資料的修改和删除擦偶,在RC、RR隔離級别下都支援。
- 間隙鎖:鎖定索引間隙的記錄,保證鎖定間隙的記錄不變,防止在其他事務在這個間隙進行插入操作,産生幻讀,在RR隔離級别以下都支援。
- 臨鍵鎖:行鎖和間隙鎖的結合,同時鎖定資料以及資料前的間隙,在RR隔離級别以下支援。