mysql锁机制总结
1.隔離級(jí)別
(1)讀不提交(Read Uncommited,RU)
這種隔離級(jí)別下,事務(wù)間完全不隔離,會(huì)產(chǎn)生臟讀,可以讀取未提交的記錄,實(shí)際情況下不會(huì)使用。
(2)讀提交(Read commited,RC)
僅能讀取到已提交的記錄,這種隔離級(jí)別下,會(huì)存在幻讀現(xiàn)象,所謂幻讀是指在同一個(gè)事務(wù)中,多次執(zhí)行同一個(gè)查詢,返回的記錄不完全相同的現(xiàn)象。幻讀產(chǎn)生的根本原因是,在RC隔離級(jí)別下,每條語句都會(huì)讀取已提交事務(wù)的更新,若兩次查詢之間有其他事務(wù)提交,則會(huì)導(dǎo)致兩次查詢結(jié)果不一致。雖然如此,讀提交隔離級(jí)別在生產(chǎn)環(huán)境中使用很廣泛。
(3)可重復(fù)讀(Repeatable Read, RR)
可重復(fù)讀隔離級(jí)別解決了不可重復(fù)讀的問題,但依然沒有解決幻讀的問題。那么不可重復(fù)讀與幻讀有什么區(qū)別呢?不可重復(fù)讀重點(diǎn)在修改,即讀取過的數(shù)據(jù),兩次讀的值不一樣;而幻讀則側(cè)重于記錄數(shù)目變化【插入和刪除】。一般教科書上告訴我們只有到串行化隔離級(jí)別才解決幻讀問題,但mysql的innodb比較特殊,RR即解決了幻讀問題,主要通過GAP鎖實(shí)現(xiàn)。另外,不是所有的數(shù)據(jù)庫都實(shí)現(xiàn)了該隔離級(jí)別,后面會(huì)簡(jiǎn)單介紹下mysql是如何實(shí)現(xiàn)可重復(fù)讀隔離級(jí)別的。
(4)串行化(Serializable)
在串行化隔離模式下,消除了臟讀,幻象,但事務(wù)并發(fā)度急劇下降,事務(wù)的隔離級(jí)別與事務(wù)的并發(fā)度成反比,隔離級(jí)別越高,事務(wù)的并發(fā)度越低。實(shí)際生產(chǎn)環(huán)境下,dba會(huì)在并發(fā)和滿足業(yè)務(wù)需求之間作權(quán)衡,選擇合適的隔離級(jí)別。
2.并發(fā)調(diào)度方式
與隔離級(jí)別緊密聯(lián)系的另外一個(gè)東西是并發(fā)調(diào)度,通過并發(fā)調(diào)度實(shí)現(xiàn)隔離級(jí)別。對(duì)于并發(fā)調(diào)度,不同的數(shù)據(jù)庫廠商有不同的實(shí)現(xiàn)機(jī)制,但基本原理類似,都是通過加鎖來保護(hù)數(shù)據(jù)對(duì)象不同時(shí)被多個(gè)事務(wù)修改。多版本的并發(fā)控制(MVCC)相對(duì)于傳統(tǒng)的基于鎖的并發(fā)控制主要特點(diǎn)是讀不上鎖,這種特性對(duì)于讀多寫少的場(chǎng)景,大大提高了系統(tǒng)的并發(fā)度,因此大部分關(guān)系型數(shù)據(jù)庫都實(shí)現(xiàn)了MVCC。
3.兩階段鎖協(xié)議
兩階段鎖協(xié)議的含義是,事務(wù)分為兩個(gè)階段,第一個(gè)階段是獲得封鎖,第二個(gè)階段是釋放封鎖。兩階段封鎖保證并發(fā)調(diào)度的正確性。兩階段封鎖相對(duì)于一階段封鎖(一次性獲得事務(wù)需要的所有鎖),提高了并發(fā)度,但同時(shí)也帶來了死鎖的可能。
4.死鎖
所謂死鎖是指兩個(gè)或多個(gè)事務(wù),各自占有對(duì)方的期望獲得的資源,形成的循環(huán)等待,彼此無法繼續(xù)執(zhí)行的一種狀態(tài)。
5.鎖類型
根據(jù)鎖的類型分,可以分為共享鎖,排他鎖,意向共享鎖和意向排他鎖。根據(jù)鎖的粒度分,又可以分為行鎖,表鎖。對(duì)于mysql而言,事務(wù)機(jī)制更多是靠底層的存儲(chǔ)引擎來實(shí)現(xiàn),因此,mysql層面只有表鎖,而支持事務(wù)的innodb存儲(chǔ)引擎則實(shí)現(xiàn)了行鎖(記錄鎖),gap鎖,next-key鎖。Mysql的記錄鎖實(shí)質(zhì)是索引記錄的鎖,因?yàn)?span lang="EN-US">innodb是索引組織表;gap鎖是索引記錄間隙的鎖,這種鎖只在RR隔離級(jí)別下有效;next-key鎖是記錄鎖加上記錄之前gap鎖的組合。mysql通過gap鎖和next-key鎖實(shí)現(xiàn)RR隔離級(jí)別。
說明:
6.?鎖互斥與兼容關(guān)系矩陣???
? | X???(排他鎖) | S???(共享鎖) | IX?(意向排他鎖)?? | IS(意向共享鎖) |
X? | n???? | n??? | n???? | n |
S? | n???? | y??? | n???? | y |
IX | n???? | n??? | y???? | y |
IS | n???? | y??? | y | ?y |
?(y表示兼容,n表示不兼容):
7.mysql鎖相關(guān)操作
(1).查看最近一次死鎖信息
show innodb engine status;
查看LATEST DETECTED DEADLOCK這一欄的相關(guān)信息。
(2)查看正在使用的鎖
SELECT?r.trx_id?????????????waiting_trx_id,?r.trx_query???????????waiting_query,?b.trx_id????????????????blocking_trx_id,?b.trx_query???????????blocking_query,?b.trx_mysql_thread_id?blocking_thread,?b.trx_started,?b.trx_wait_started? FROM???information_schema.innodb_lock_waits?w?INNER?JOIN?information_schema.innodb_trx?b?ON?b.trx_id?=?w.blocking_trx_id?INNER?JOIN?information_schema.innodb_trx?r?ON?r.trx_id?=?w.requesting_trx_id?
(3)查看事務(wù)的隔離級(jí)別
show variables like 'tx_isolation';
8.典型SQL語句鎖分析
(1).select ......lock in share mode 獲得共享鎖。【對(duì)于表上意向共享鎖;對(duì)于讀取的每一個(gè)行,上行級(jí)共享鎖】 (2).select ...... for update 獲得排他鎖【對(duì)于表上意向排他鎖;對(duì)于讀取的每一個(gè)行,會(huì)上行級(jí)排他鎖】 (3).insert into target_tab select * from source_tab where ... (4).create table new_tab as select ... From source_tab where ... (3)和(4)在RR隔離級(jí)別下,會(huì)對(duì)source_tab上鎖,防止出現(xiàn)幻讀;RC隔離級(jí)別下,不上鎖。 (5).FLUSH TABLES WITH READ LOCK 全局讀鎖定,鎖定數(shù)據(jù)庫中的所有庫中的所有表,mysqldump會(huì)用到這個(gè)命令。
PS:登博有一篇文章《MySQL加鎖處理分析》對(duì)mysql加鎖寫地非常詳細(xì),大家可以好好學(xué)習(xí)下,鏈接地址:http://hedengcheng.com/?p=771
總結(jié)
以上是生活随笔為你收集整理的mysql锁机制总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: b/s模式下的即时通讯,使用ajax框架
- 下一篇: MySQL线程共享内存参数