程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySql性能調優(五)采用合適的鎖機制之表鎖的演示

MySql性能調優(五)采用合適的鎖機制之表鎖的演示

編輯:MySQL綜合教程

MySql性能調優(五)采用合適的鎖機制之表鎖的演示


MySql的鎖有以下幾種形式:

1. 表級鎖;開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的概率最高 ,並發度最低。MyISAM引擎屬於這種類型。

2. 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突概率最低,並發度也最高。InnoDB引擎屬於這種類型。

3. 頁面鎖:開銷和加鎖時間介於表鎖和行鎖之間;會出現死鎖;鎖定粒度也介於兩者之間,並發度一般。NDB屬於這種類型。

一. 表鎖的演示

MyISAM存儲引擎只支持表鎖,所以對其進行操作會存在以下情況:

1.對MyISAM表的讀操作,不會堵塞其他進程對同一表的讀請求,但會阻塞對同一表的寫請求。只有當讀鎖釋放後,才會執行其他進程的寫操作。

2.對MyISAM表的寫操作,會阻塞其他進程對同一表的讀或寫操作,只有當寫釋放後,才會執行其他進程的讀寫操作。

【示例】:

\

打開另一個會話:

\

會話2會一直等待,直到會話一鎖的釋放。

\

同時會話2的執行:

\

二. 行鎖的演示

InnoDB存儲引擎是通過給索引項加鎖來實現的,這就意味著:只有通過索引條件檢索數據,InnoDB才會使用行級鎖,否則,InnoDB將使用表鎖。

1. 行鎖

myiSAM引擎下兩個會話更新同一條記錄會響應,因為myiSAM是表鎖。<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20150529/2015052910190246.jpg" alt="\">

\

但在InnoDB中:

\

在會話2中,

\

此時會鎖等待。因為更新的是同一條記錄。

2. 對未加索引檢索數據

\

\

原因是通過索引條件檢索數據,InnoDB才會使用行級鎖,否則,InnoDB將使用表鎖。

3. 死鎖

\

\

這時會話1會一直等待…

\

會話2在進行更改會超時…

\

再看會話1


發生死鎖之後,InnoDB會自動檢測到,它會讓一個事務釋放鎖並回退,另一個事務則獲得鎖,繼續完成事務。死鎖是無法避免的,我們通過調整業務的邏輯來盡量減少死鎖出現的概率。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved