mysql鎖機制

為什么要鎖

當多個用戶并發(fā)地存取數(shù)據(jù)時喻旷,在數(shù)據(jù)庫中就會產(chǎn)生多個事務同時存取同一數(shù)據(jù)的情況记劝。若對并發(fā)操作不加控制就可能會讀取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性(臟讀,不可重復讀乾戏,幻讀等),可能產(chǎn)生死鎖白粉。為了解決這個問題讯壶,加鎖是一個非常重要的技術(shù),對實現(xiàn)數(shù)據(jù)庫并發(fā)控制是一個好的方案状婶。簡單說意敛,當一個執(zhí)行sql語句的事務想要操作表記錄之前膛虫,先向數(shù)據(jù)庫發(fā)出請求草姻,對你訪問的記錄集加鎖,在這個事務釋放這個鎖之前稍刀,其他事務不能對這些數(shù)據(jù)進行更新操作撩独。


MySQL存儲引擎

對比項 MyISAM innoDB
主外鍵 不支持 支持
事務 不支持 支持
行表鎖 表鎖。操作一條記錄也會鎖住整個表 行鎖。操作時只鎖某一行
緩存 只緩存索引跌榔,不緩存真實數(shù)據(jù) 不僅緩存索引异雁,還緩存真實數(shù)據(jù)
表空間
關(guān)注點 性能 事務
默認安裝 Y Y
-- mysql現(xiàn)在已提供什么存儲引擎:
mysql> show engines;
 
-- mysql查詢當前默認的存儲引擎
mysql>show variables like '%storage_engine%';
 
-- 要看某個表用了什么引擎
mysql> show create table 表名;

行級鎖

防止另外事務修改此行

支持存儲引擎:

  • mysql默認存儲引擎 InnoDB(默認行級鎖)
  • 分布式存儲引擎 NDBCluster

行級鎖類型:

  • 共享鎖

名詞解釋: 共享鎖又叫做讀鎖,所有的事務只能對其進行讀操作不能寫操作僧须,加上共享鎖后在事務結(jié)束之前其他事務只能再加共享鎖纲刀,除此之外其他任何類型的鎖都不能再加了。也就是我讀取的行担平,你不能修改

用法: SELECT id FROM table WHERE id in(1,2) LOCK IN SHARE MODE 結(jié)果集的數(shù)據(jù)都會加共享鎖

  • 排他鎖

名詞解釋: 若某個事物對某一行加上了排他鎖示绊,只能這個事務對其進行讀寫,在此事務結(jié)束之前暂论,其他事務不能對其進行加任何鎖面褐,其他進程可以讀取,不能進行寫操作,需等待其釋放取胎。也就是我更新的行展哭,不允許其他的事務讀取和更新相同的行;

用法: SELECT id FROM table WHERE id=1 FOR UPDATE

特點:

開鎖大闻蛀,加鎖慢匪傍;會出現(xiàn)死鎖;鎖定粒度最小觉痛,發(fā)生鎖沖突的概率最低役衡,并發(fā)度也最高。適合于有大量按索引更新少量不同數(shù)據(jù)薪棒,同時又有并發(fā)查詢的應用手蝎,如一些在線事務處理系統(tǒng)


表級鎖

表示對當前操作的整張表加鎖

支持存儲引擎:

  • MYISAM
  • INNODB

行級鎖類型:

  • 表共享讀鎖(共享鎖)

  • 表獨占寫鎖(排他鎖)

特點

開銷小,加鎖快俐芯;不會出現(xiàn)死鎖棵介;鎖定粒度大,發(fā)出鎖沖突的概率最高吧史,并發(fā)度最低鞍时。


悲觀鎖(排它鎖)

每次去拿數(shù)據(jù)的時候都認為別人會修改,所以每次在拿數(shù)據(jù)的時候都會上鎖扣蜻,這樣別人想拿這個數(shù)據(jù)就會block直到它拿到鎖

傳統(tǒng)的關(guān)系型數(shù)據(jù)庫里邊就用到了很多這種鎖機制逆巍,比如行鎖,表鎖等莽使,讀鎖锐极,寫鎖等,都是在做操作之前先上鎖芳肌。

樂觀鎖

每次去拿數(shù)據(jù)的時候都認為別人不會修改灵再,所以不會上鎖肋层,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個數(shù)據(jù),可以使用版本號等機制

樂觀鎖適用于多讀的應用類型翎迁,這樣可以提高吞吐量栋猖,像數(shù)據(jù)庫如果提供類似于write_condition機制的其實都是提供的樂觀鎖

樂觀鎖實現(xiàn): 大多數(shù)基于數(shù)據(jù)版本(Version)記錄機制實現(xiàn)

具體可通過給表加一個版本號或時間戳字段實現(xiàn),當讀取數(shù)據(jù)時汪榔,將version字段的值一同讀出蒲拉,數(shù)據(jù)每更新一次,對此version值加一痴腌。當我們提交更新的時候雌团,判斷當前版本信息與第一次取出來的版本值大小,如果數(shù)據(jù)庫表當前版本號與第一次取出來的version值相等士聪,則予以更新锦援,否則認為是過期數(shù)據(jù),拒絕更新剥悟,讓用戶重新操作灵寺。

悲觀鎖 和 樂觀鎖的區(qū)別

兩種鎖各有優(yōu)缺點,不可認為一種好于另一種区岗,像樂觀鎖適用于寫比較少的情況下替久,即沖突真的很少發(fā)生的時候,這樣可以省去了鎖的開銷躏尉,加大了系統(tǒng)的整個吞吐量。但如果經(jīng)常產(chǎn)生沖突后众,上層應用會不斷的進行retry胀糜,這樣反倒是降低了性能,所以這種情況下用悲觀鎖就比較合適蒂誉。


死鎖

所謂死鎖<DeadLock>: 是指兩個或兩個以上的進程在執(zhí)行過程中,
因爭奪資源而造成的一種互相等待的現(xiàn)象,若無外力作用,它們都將無法推進下去.
此時稱系統(tǒng)處于死鎖狀態(tài)或系統(tǒng)產(chǎn)生了死鎖,這些永遠在互相等竺的進程稱為死鎖進程.
表級鎖不會產(chǎn)生死鎖.所以解決死鎖主要還是針對于最常用的InnoDB.

++死鎖的關(guān)鍵在于:兩個(或以上)的Session加鎖的順序不一致教藻。++

解除死鎖狀態(tài)
解除正在死鎖的狀態(tài)有兩種方法:
第一種:

1.查詢是否鎖表
show OPEN TABLES where In_use > 0;
2.查詢進程(如果您有SUPER權(quán)限,您可以看到所有線程右锨。否則括堤,您只能看到您自己的線程)
show processlist
3.殺死進程id(就是上面命令的id列)
kill id

第二種:

1.查看下在鎖的事務 
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2.殺死進程id(就是上面命令的trx_mysql_thread_id列)
kill 線程ID

其它關(guān)于查看死鎖的命令:

1:查看當前的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2:查看當前鎖定的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
3:查看當前等鎖的事務
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绍移,隨后出現(xiàn)的幾起案子悄窃,更是在濱河造成了極大的恐慌,老刑警劉巖蹂窖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轧抗,死亡現(xiàn)場離奇詭異,居然都是意外死亡瞬测,警方通過查閱死者的電腦和手機横媚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門纠炮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灯蝴,你說我怎么就攤上這事恢口。” “怎么了穷躁?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵耕肩,是天一觀的道長。 經(jīng)常有香客問我折砸,道長看疗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任睦授,我火速辦了婚禮两芳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘去枷。我一直安慰自己怖辆,他們只是感情好,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布删顶。 她就那樣靜靜地躺著竖螃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逗余。 梳的紋絲不亂的頭發(fā)上特咆,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機與錄音录粱,去河邊找鬼腻格。 笑死,一個胖子當著我的面吹牛啥繁,可吹牛的內(nèi)容都是我干的菜职。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼旗闽,長吁一口氣:“原來是場噩夢啊……” “哼酬核!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起适室,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嫡意,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后捣辆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹅很,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年罪帖,在試婚紗的時候發(fā)現(xiàn)自己被綠了促煮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片邮屁。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖菠齿,靈堂內(nèi)的尸體忽然破棺而出佑吝,到底是詐尸還是另有隱情,我是刑警寧澤绳匀,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布芋忿,位于F島的核電站,受9級特大地震影響疾棵,放射性物質(zhì)發(fā)生泄漏戈钢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一是尔、第九天 我趴在偏房一處隱蔽的房頂上張望殉了。 院中可真熱鬧,春花似錦拟枚、人聲如沸薪铜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隔箍。三九已至,卻和暖如春脚乡,著一層夾襖步出監(jiān)牢的瞬間蜒滩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工奶稠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留俯艰,地道東北人。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓窒典,卻偏偏與公主長得像,于是被迫代替她去往敵國和親稽莉。 傳聞我的和親對象是個殘疾皇子瀑志,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 悲觀鎖與樂觀鎖: 悲觀鎖:顧名思義,就是很悲觀污秆,每次去拿數(shù)據(jù)的時候都認為別人會修改劈猪,所以每次在拿數(shù)據(jù)的時候都會上鎖...
    像敏銳的狗閱讀 269評論 0 0
  • 行鎖、表鎖對比 開銷良拼、加鎖速度战得、死鎖、粒度庸推、并發(fā)性能 表鎖:開銷小常侦,加鎖快浇冰;不會出現(xiàn)死鎖;鎖定力度大聋亡,發(fā)生鎖沖突概...
    高廣超閱讀 6,160評論 0 25
  • MYSQL 鎖機制數(shù)據(jù)庫在對資源進行高并發(fā)的讀寫操作時肘习,為了保證數(shù)據(jù)的一致性,有效性坡倔,鎖是很重要的機制漂佩。Mysql...
    大帥流皮阿閱讀 243評論 0 1
  • MYSQL 鎖機制 數(shù)據(jù)庫在對資源進行高并發(fā)的讀寫操作時,為了保證數(shù)據(jù)的一致性罪塔,有效性投蝉,鎖是很重要的機制。Mysq...
    莫Y兮閱讀 7,580評論 2 13
  • 題記:他必在列國中施行審判征堪,為許多國民斷定是非瘩缆。他們要將刀打成犁頭,把槍打成鐮刀请契;這國不舉刀攻擊那國咳榜,他們也不再學...
    膠片電影閱讀 1,314評論 0 1