MySQL高級知識(十三)——表鎖

前言:鎖是計算機協調多個進程或線程併發訪問某一資源的機制。在數據庫中,除傳統的計算機資源(如CPU、RAM、I/O等)的爭用外,數據也是一種供許多用戶共享的資源。如何保證數據併發訪問的一致性、有效性是全部數據庫必須解決的一個問題,鎖衝突也是影響數據併發訪問性能的一個重要因素。從這個角度來講,鎖對數據庫而言顯得尤爲重要,也更加複雜。html


1.鎖的分類

#1.從對數據操做的類型來分數據庫

讀鎖(共享鎖)寫鎖(排它鎖)併發

#2.從對數據操做的粒度來分性能

表鎖行鎖spa

2.表鎖(偏讀)

特色:偏向MyISAM存儲引擎,開銷小,加鎖快,無死鎖,鎖定粒度大,發生鎖衝突的機率最高,併發度低。下面經過案例來講明表鎖的一些狀況。線程

#1.建立mylock表,並插入5條數據。注意數據引擎使用的是MyISAMcode

drop table if exists mylock; CREATE TABLE mylock ( id INT PRIMARY KEY auto_increment, name VARCHAR (20) NOT NULL ) ENGINE MyISAM DEFAULT charset = utf8; insert into mylock (name) values ('a'); insert into mylock (name) values ('b'); insert into mylock (name) values ('c'); insert into mylock (name) values ('d'); insert into mylock (name) values ('e');

#2.手動增長表鎖命令。htm

lock table tablename1 read(write),tablename2 read(write);

#3.查看錶是否被加鎖。blog

若是In_use顯示不爲0,則表示表被加鎖。進程

#4.釋放表鎖命令

unlock tables;

3.表鎖(read)案例

#1.在mylock表上加讀鎖。將當前會話命名爲A。

在A會話中查詢mylock中的數據。

數據查詢正常,沒有任何問題。

#2.再開一個會話,命名爲B,查詢mylock中的數據。

數據查詢正常,沒有任何問題。

#3.進行其餘操做。

①在A會話中進行更新操做。

分析:

提示mylock表被加鎖,不能進行更新操做。緣由:mylock正被讀鎖鎖住,未解鎖不能進行更新操做。

②在B會話中讀其餘表。

分析:

A會話mylock表的讀鎖,並不影響B會話對mylock表和其餘表的讀操做

③在A會話中讀其餘表

分析:

因爲A會話對mylock表加了讀鎖,在未解鎖前,不能操做其餘表。

④在B會話中修改mylock表中的內容。

分析:

出現了阻塞狀況,緣由:因爲A會話對mylock表加鎖,在鎖未釋放時,其餘會話是不能對mylock表進行更新操做的。

⑤在A會話中對mylock表進行解鎖操做,注意觀察B會話中的變化。

分析:

在A會話中對mylock表解鎖後,B會話更新操做成功,可看到B會話中的更新操做等待了22分鐘。

4.表鎖(write)案例

#1.在A會話中對mylock表加寫鎖。

#2.在A會話中對mylock表進行讀寫操做。

分析:

因爲A會話對mylock表加的寫鎖,因此讀寫操做都執行正常。

#3.在A會話中對其餘表進行操做。

分析:

在A會話中對其餘表進行讀寫操做都失敗,由於A會話中mylock表的寫鎖並未被釋放。

#4.在B會話中對mylock表進行讀操做。

分析:

因爲mylock表已經加寫鎖,而寫鎖爲排它鎖,所以在B會話中對mylock表進行讀操做阻塞。

因爲B會話中對mylock的讀操做都阻塞,因此其餘操做也是阻塞的。

5.表鎖定分析

#1.使用以下命令查看是否有表被鎖定。

show open tables where In_use>0;

#2.使用以下命令分析表鎖。

show status like 'table%';

主要注意兩個變量的值:

Table_locks_immediate:產生表級鎖定的次數,表示可當即獲取鎖的查詢次數,每當即獲取鎖一次該值加1。

Table_locks_waited:出現表級鎖定爭用而發生等待的次數(不能當即獲取鎖的次數,每等待一次鎖該值加1),此值高則說明存在較嚴重的表級鎖爭用狀況。

總結

注意數據庫引擎爲MyISAM

①對MyISAM表加讀鎖不會阻塞其餘進程對同一表(mylock)的讀操做,可是會阻塞對同一表的寫請求,只有當讀鎖釋放後,纔會執行其餘進程的寫操做。

②在加讀鎖並未釋放鎖時,該進程不能對同一表(mylock)進行寫操做,而且也不能對其餘表進行操做。

③對MyISAM表加寫鎖,會阻塞其餘進程對同一表(mylock)的讀和寫操做,只有當讀鎖釋放後,纔會執行其餘進程的寫操做。

④在加寫鎖並未釋放鎖時,該進程不能對其餘表進行操做。

簡而言之:讀鎖會阻塞寫,可是不會阻塞讀,而寫鎖會把讀和寫都阻塞。

此外,MyISAM的讀寫鎖調度是寫優先,這也是MyISAM不適合作寫爲主的表的引擎,由於寫鎖後,其餘線程不能作任何操做,大量的更新會使查詢很可貴到鎖,從而形成長時間阻塞。


by Shawn Chen,2018.6.28日,上午。


相關內容

MySQL高級知識系列目錄

相關文章
相關標籤/搜索