程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> Mysql教程:對MySQL中的鎖機制的總結

Mysql教程:對MySQL中的鎖機制的總結

編輯:關於MYSQL數據庫

今天來簡單總結一下MySQL的鎖機制,不妥的歡迎拍磚!

1、對於MySQL來說,有三種鎖的級別:頁級、表級、行級。

頁級的典型代表引擎為BDB。
表級的典型代表引擎為MyISAM,MEMORY以及很久以前的ISAM。
行級的典型代表引擎為INNODB。

2、我們實際應用中用的最多的就是行鎖了。

行級鎖的優點如下:
1)、當很多連接分別進行不同的查詢時減小LOCK狀態。
2)、如果出現異常,可以減少數據的丟失。因為一次可以只回滾一行或者幾行少量的數據。

行級鎖的缺點如下:
1)、比頁級鎖和表級鎖要占用更多的內存。
2)、進行查詢時比頁級鎖和表級鎖需要的I/O要多,所以我們經常把行級鎖用在寫操作而不是讀操作。
3)、容易出現死鎖。

3、MySQL用寫隊列和讀隊列來實現對數據庫的寫和讀操作。

對於寫鎖定如下:
1)、如果表沒有加鎖,那麼對其加寫鎖定。
2)、否則,那麼把請求放入寫鎖隊列中。

對於讀鎖定如下:
1)、如果表沒有加寫鎖,那麼加一個讀鎖。
2)、否則,那麼把請求放到讀鎖隊列中。
當然我們可以分別用low_priority 以及high_priority在寫和讀操作上來改變這些行為。


4、下面我來一個簡單的例子解釋上面的說法

我們來運行一個時間很長的查詢
1)客戶端1:
MySQL> select count(*) from content group by content;
...
客戶端2:
MySQL> update content set content = 'I love you' where id = 444;
Query OK, 1 row affected (30.68 sec)
Rows matched: 1 Changed: 1 Warnings: 0
用了半分鐘。

2)我們現在終止客戶端1。
此時客戶端2:
MySQL> update content set content = 'I hate you' where id = 444;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
僅僅用了20毫秒。

這個例子很好的說明了讀寫隊列的運行。
對於1中的客戶端1,此時表沒有加鎖,當然也沒有加寫鎖了,那麼此時客戶端1對表加了一個讀鎖。
對於1中的客戶端2,此時因為表有一個讀鎖,所以把UPDATE請求放到寫鎖定隊列中。
當讀鎖釋放的時候,也就是SHOW PROCESSLIST中STATUS 為COPY TO TMP TABLE的時候,UPDATE操作開始執行。

5、可以在REPLICATION中對MASTER 和SLAVE運用不同的鎖定使系統達到最佳的性能。(當然這個前提是SQL語句都是最優的。)

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