Mysql 數據庫鎖機制淺析

鎖機制根據不一樣的存儲引擎表現不同,下面分析MyISAM存儲引擎與InnoDB兩種存儲引擎。
 
一,MyISAM
1,該引擎採用的是表級鎖,有:
讀鎖:表級讀共享鎖;
寫鎖:表級獨佔鎖。
具體表現爲:
1.1,當一個session對錶加了讀鎖以後,本session能夠對錶進行讀操做,寫操做排隊操做。其它session能夠進行讀操做,寫操做排隊。
1.2,當一個session對錶加了寫鎖以後,本session能夠對錶進行讀寫操做,其它session讀寫操做排隊。
2,鎖操做由誰觸發。
通常由數據庫自動添加鎖。
顯示添加語法以下:
Lock table 表名 鎖類型【讀/寫】
3,併發插入問題
 
4,鎖調度問題
當讀進程與寫進程爭搶同一張表的時候,寫進程優先獲取寫鎖。在排隊隊列中處於隊列後面的寫進程回先於對列前面的讀進程得到鎖。
能夠看出此引擎不適合大量寫操做場景。
經過如下一些設置能夠控制MyISAM引擎的調度行爲:
(1)經過指定啓動參數low-priority-updates,使MyISAM引擎默認給予讀請求以優先的權利。

(2)經過執行命令SET LOW_PRIORITY_UPDATES=1,使該鏈接發出的更新請求優先級下降。mysql

(3)經過指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性,下降該語句的優先級。sql

(4)給系統參數max_write_lock_count設置一個合適的值,當一個表的讀鎖達到這個值後,MySQL就暫時將寫請求的優先級下降,給讀進程必定得到鎖的機會。數據庫

二,InnoDBsession

1,該引擎採用行級鎖與表級鎖。併發

行鎖:共享鎖(S)與排他鎖(X)。spa

表鎖:意向排他鎖與意向共享鎖。code

表鎖是由mysql自動添加的。select添加共享鎖,update、insert、delete添加排他鎖。server

2,行鎖實現方式。索引

InnoDB是經過給索引項添加鎖來實現行級鎖的,這個特色意味着:隊列

(1)只有經過索引條件檢索數據,InnoDB才使用行級鎖,不然,InnoDB 將使用表鎖。

(2)因爲MySQL的行鎖是針對索引加的鎖,不是針對記錄加的鎖,因此雖然是訪問不一樣行的記錄,可是若是是使用相同的索引鍵,是會出現鎖衝突的。

(3)當表有多個索引的時候,不一樣的事務可使用不一樣的索引鎖定不一樣的行,另外,不管是使用主鍵索引、惟一索引或普通索引,InnoDB 都會使用行鎖來對數據加鎖。(雖然使用的是不一樣的索引,可是若是記錄已經被其餘session鎖定的話也是須要等待的。)

(4)即使在條件中使用了索引字段,可是否使用索引來檢索數據是由MySQL 經過判斷不一樣執行計劃的代價來決定的,若是MySQL 認爲全表掃描效率更高,好比對一些很小的表,它就不會使用索引,這種狀況下InnoDB將使用表鎖,而不是行鎖。

=================================================================

Mysql分爲server層與引擎層。

鏈接創建在server上,後續加鎖下沉到不一樣的存儲引擎實現。

一,分析Innodb加鎖過程。Myisam只有表鎖。

分析加鎖過程的前提條件,事務隔離級別。

二,數據庫提供的事務隔離級別
1,read-uncommitted(讀未提交)
2,read-committed(讀提交)
3,repeatable-read(重複讀)
4,serializable(串行)

數據庫併發產生的問題

髒讀:事務A讀取了事務B更新的數據,然而事務B回滾。形成A讀取的數據爲髒數據;
不可重複讀:事務A屢次讀取同一數據,事務B在事務A讀取的過程當中修改了數據並提交。致使事務A讀取的數據不一致;
幻讀:事務A更改了表中所有數據,事務B往其中插入了一些數據。致使事務A產生幻覺認爲沒有修改所有數據行。

===========================================================================================
       隔離級別               髒讀(Dirty Read)          不可重複讀(NonRepeatable Read)     幻讀(Phantom Read) 
===========================================================================================

未提交讀(Read uncommitted)        可能                            可能                       可能

已提交讀(Read committed)          不可能                          可能                        可能

可重複讀(Repeatable read)          不可能                          不可能                     可能

可串行化(Serializable )                不可能                          不可能                     不可能

===========================================================================================

相關文章
相關標籤/搜索