MYSQL鎖機制

MYSQL鎖機制主要包含行級鎖(INNODB引擎),表級鎖(MYISAM引擎),頁級鎖(BOB引擎)


一:MYSQL常見的幾種鎖機制

行級鎖所實現的鎖定顆粒度是最小的,發生鎖定資源爭用的概率也最小,能夠儘可能大的提升併發處理能力;但是因爲鎖定資源的顆粒度小所以每次釋放鎖消耗的資源更多,消耗會增大,行級鎖也最容易發生死鎖


表級鎖是最大顆粒度的鎖定機制,邏輯簡單,帶來的系統負面影響最小;由於表級鎖一次會鎖定整張表所以可以很好的避免死鎖的問題,但是會帶來鎖定資源爭用的問題



(暫時只用到了表級和行級所以只介紹這兩個)


二:表級鎖定的兩種類型

MYSQL表級鎖定主要分爲兩種類型:一種是讀鎖定另一種是寫鎖定

何時可以獲取表級讀鎖定的資源:資源沒有被寫鎖定,寫鎖定等待隊列中沒有更高優先級的寫鎖定等待;讀鎖鎖定之後其他的進程還是可以進行讀操作的

何時可以獲取表級寫鎖定的資源:沒有被寫鎖定;沒有被寫鎖定等待;沒有被讀鎖定;寫鎖鎖定之後其他的進程都是不能進行讀操作的


在MySQL中,主要通過四個隊列來維護這兩種鎖定:兩個存放當前正在鎖定中的讀和寫鎖定信息,另外兩個存放等待中的讀寫鎖定信息,如下:

Current read-lock queue (lock->read)

Pending read-lock queue (lock->read_wait)

Current write-lock queue (lock->write)

Pending write-lock queue (lock->write_wait)



三:(INNODB)行級鎖定的兩種類型

MYSQL行級鎖定同樣分爲兩種類型:一種是共享鎖另一種是排它鎖;而在鎖定機制的實現過程中爲了讓行級鎖定和表級鎖定共存,Innodb也同樣使用了意向鎖(表級鎖定)的概念,也就有了意向共享鎖和意向排他鎖這兩種

當一個事務需要給自己需要的某個資源加鎖的時候,如果遇到一個共享鎖正鎖定着自己需要的資源的時候,自己可以再加一個共享鎖,不過不能加排他鎖。但是,如果遇到自己需要鎖定的資源已經被一個排他鎖佔有之後,則只能等待該鎖定釋放資源之後自己才能獲取鎖定資源並添加自己的鎖定。而意向鎖的作用就是當一個事務在需要獲取資源鎖定的時候,如果遇到自己需要的資源已經被排他鎖佔用的時候,該事務可以需要鎖定行的表上面添加一個合適的意向鎖。如果自己需要一個共享鎖,那麼就在表上面添加一個意向共享鎖。而如果自己需要的是某行(或者某些行)上面添加一個排他鎖的話,則先在表上面添加一個意向排他鎖。意向共享鎖可以同時並存多個,但是意向排他鎖同時只能有一個存在。所以,可以說Innodb的鎖定模式實際上可以分爲四種:共享鎖(S),排他鎖(X),意向共享鎖(IS)和意向排他鎖(IX),我們可以通過以下表格來總結上面這四種所的共存邏輯關係:

 

共享鎖(S)

排他鎖(X)

意向共享鎖(IS)

意向排他鎖(IX)

共享鎖(S)

兼容

衝突

兼容

衝突

排他鎖(X)

衝突

衝突

衝突

衝突

意向共享鎖(IS)

兼容

衝突

兼容

兼容

意向排他鎖(IX)

衝突

衝突

兼容

兼容

 

 

 

 

 

 

 

 

 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章