首頁  >  文章  >  資料庫  >  Mysql-各種鎖定區分與MVCC的詳解

Mysql-各種鎖定區分與MVCC的詳解

黄舟
黄舟原創
2017-03-02 15:54:242748瀏覽

mysql的鎖貌似有很多啊,查了大部分資料,

什麼表鎖,行鎖,頁鎖

#共享鎖,排他鎖,意向鎖,讀鎖,寫鎖

悲觀鎖,樂觀鎖。 。

我去,真想問一句,有沒有 金鎖?我還范冰冰呢。 。 。

哎呀怎麼感覺好亂。那麼把它好好整理總結下吧。

後邊還有對在innodb下的mvcc理解與舉例,在並發量的訪問下如何保持高效一致?簡單易懂了解下,聽朋友說大公司面試也愛問這個。

表格/行/頁-鎖定:

#表單等級鎖定(table-level locking):MyISAM和MEMORY儲存引擎

行級鎖定(row-level locking) :InnoDB儲存引擎

頁面鎖定(page-level-locking):BDB儲存引擎


表格層級鎖定:開銷小,並低,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖定衝突的機率最高,並發度也最低

行級鎖定:開銷大,並發高,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖定衝突的機率最低,並發度也最高。

頁面鎖定:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,並發度一般。

共享/排他鎖

共享鎖定又稱讀鎖,是讀取操作所建立的鎖定。其他使用者可以並發讀取數據,但任何事務都不能對數據進行修改(獲取數據上的排他鎖),直到已釋放所有共享鎖。

排他鎖又稱寫鎖,如果事務T對資料A加上排他鎖後,則其他事務不能再對A加任任何類型的封鎖。獲準排他鎖的事務既能讀取數據,又能修改數據。

Mysiam鎖定模式

MyISAM在執行查詢語句(SELECT)前,會自動將涉及的所有資料表加讀鎖定,在執行更新作業(UPDATE、DELETE、INSERT等)前,會自動為涉及的表格加上寫入鎖定。

a、對MyISAM表的讀取操作(加讀鎖定),不會阻塞其他程序對同一表的讀取請求,但會阻塞對同一表的寫入請求.只有當讀鎖釋放後才會執行其它進程的寫入操作。

b、對MyISAM表的寫入操作(加寫鎖定),會阻塞其他進程對同一表的讀取和寫入操作,只有當寫鎖定釋放後,才會執行其它進程的讀寫操作。


innodb鎖定模式

#意向鎖定是InnoDB自動加的,不需要使用者乾預。

對於insert、update、delete,InnoDB會自動將涉及的資料加排他鎖(X);對於一般的Select語句,InnoDB不會加任何鎖,事務可以透過以下語句給顯示加上共享鎖或排他鎖。

共享鎖定: SELECT ... LOCK IN SHARE MODE;

排他鎖定:  #SELECT ... FOR UPDATE;

MVCC(Multiversion concurrency control)

#一個很難懂概念,查閱了很多資料與博客,下邊做一個簡單易懂的理解。

情境模擬:

在高並發的前提下,一定要注意這個前提。

交易L1修改某表中D的key值,還未提交;

交易L2同樣也修改D的key值,提交;然後L1提交。

發生了什麼事?

L1從D讀取key:123對應的值100

L2從D讀取key:123對應的100

#L1對值增加1,將key:123更新為100 + 1

L2對值增加2,將key:123更新為100 + 2

#如果L1和L2串列執行,key:123對應的值將為103,但上面並發執行中L1的執行效果完全被L2所覆蓋,實際key:123所對應的值變成了102。就因為L1事務沒提交呢,L2又來了。

#

那要如何處理呢?

方法一:

#加鎖唄。前邊不都是在說這個鎖的問題呢,把他加寫鎖,等L1執行完再執行L2。可以是可以,但是發生了排隊,並發下降了。這是一種悲觀一般把基於鎖的並發控制機稱成為悲觀機制。

方法二:

#為了實現可串列化,同時避免鎖定機制存在的各種問題,我們可以採用基於多版本並發控制(Multiversion concurrency control,MVCC)思想的無鎖並發機制,終於把要說的引出來了!人們一般把基於鎖的並發控制機稱成為悲觀機制(悲觀鎖)#,而把MVCC等機制稱為樂觀機制(樂觀鎖)。加入版本號的一個機制,由D維護該版本號,每次資料有更新就增加版本號,透過版本號來更有效率的管理事務一致性與高並發的問題。

因為鎖定機制是一種預防性的,讀會阻塞寫,寫也會阻塞讀,當鎖定粒度較大,時間較長是並發效能就不會太好;而MVCC是一種後驗性的,讀不阻塞寫,寫也不阻塞讀,等到提交的時候才檢驗是否有衝突,由於沒有鎖,所以讀寫不會相互阻塞,從而大大提升了並發性能。

 以上是Mysql-各種鎖定區分與MVCC的詳解的內容,更多相關內容請關注PHP中文網(www.php.cn)!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn