發(fā)文章
發(fā)文工具
撰寫
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
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)象?;米x產(chǎn)生的根本原因是,在RC隔離級(jí)別下,每條語句都會(huì)讀取已提交事務(wù)的更新,若兩次查詢之間有其他事務(wù)提交,則會(huì)導(dǎo)致兩次查詢結(jié)果不一致。雖然如此,讀提交隔離級(jí)別在生產(chǎn)環(huán)境中使用很廣泛。
(3)可重復(fù)讀(Repeatable Read, RR)
可重復(fù)讀解決了幻讀問題。不是所有的數(shù)據(jù)庫都實(shí)現(xiàn)了該隔離級(jí)別,后面會(huì)簡單介紹下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ì)于讀多寫少的場景,大大提高了系統(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
S
y
IX
IS
(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:///?p=771
來自: 昵稱10504424 > 《工作》
0條評(píng)論
發(fā)表
請(qǐng)遵守用戶 評(píng)論公約
面試命中率90%的點(diǎn) —— MySQL鎖
鎖機(jī)制與InnoDB鎖算法在關(guān)系型數(shù)據(jù)庫中,可以按照鎖的粒度把數(shù)據(jù)庫鎖分為行級(jí)鎖(INNODB引擎)、表級(jí)鎖(MYISAM引擎)和頁級(jí)鎖(BDB引擎 )。...
萬字總結(jié) MySQL核心知識(shí),贈(zèng)送25連環(huán)炮
索引方式。普通索引唯一所有主鍵索引復(fù)合索引全文索引MySQL索引結(jié)構(gòu)。使用索引注意點(diǎn)最左前綴法則不要在索引列上做任何操作(計(jì)算、函數(shù)...
為什么開發(fā)人員必須要了解數(shù)據(jù)庫鎖?
時(shí)間點(diǎn) 事務(wù)A 事務(wù)B 1 begin; 2 select * from user where id = 1; begin; 3 update user set namm = ''''''...
史上最全的數(shù)據(jù)庫面試題,不看絕對(duì)后悔
2.常用的InnoDB引擎中默認(rèn)使用的是B+樹索引,它會(huì)實(shí)時(shí)監(jiān)控表上索引的使用情況,如果認(rèn)為建立哈希索引可以提高查詢效率,則自動(dòng)在內(nèi)存中的“自適應(yīng)哈希索引緩沖區(qū)”建立哈希索引(在InnoDB中默認(rèn)開啟自...
MySQL學(xué)習(xí)筆記(13):鎖和事務(wù)
臟讀:一個(gè)事務(wù)正在對(duì)一條記錄做修改,在這個(gè)事務(wù)提交前,如果另一個(gè)事務(wù)也來讀取同一條記錄,就會(huì)讀取到臟數(shù)據(jù)(如果不加控制,讀取到第一個(gè)事務(wù)修改的數(shù)據(jù),而后第一個(gè)事務(wù)回滾,第二個(gè)事務(wù)讀取到的...
Java中高級(jí)面試題(5)
什么是線程死鎖?如何避免線程死鎖?線程死鎖是指由于兩個(gè)或者多個(gè)線程互相持有對(duì)方所需要的資源,導(dǎo)致這些線程處于等待狀態(tài),無法前往執(zhí)行。當(dāng)線程互相持有對(duì)方所需要的資源時(shí),會(huì)互相等待對(duì)方釋放資...
Mysql之鎖、事務(wù)絕版詳解
(1)使用LOCK TABLES雖然可以給InnoDB加表級(jí)鎖,但必須說明的是,表鎖不是由InnoDB存儲(chǔ)引擎層管理的,而是由其上一層──MySQL Server負(fù)責(zé)的,僅當(dāng)autocommit=0(不自動(dòng)提交,默認(rèn)是自動(dòng)提交的)、Inn...
MySql數(shù)據(jù)庫——事務(wù)隔離級(jí)別和鎖關(guān)系
MySql數(shù)據(jù)庫——事務(wù)隔離級(jí)別和鎖關(guān)系。幻讀情況2:第二種情況中還可以分為兩種情況一,有AB兩個(gè)事務(wù),A事務(wù)按某個(gè)條件查詢數(shù)據(jù),B事務(wù)...
關(guān)于MySQL數(shù)據(jù)庫事務(wù)的機(jī)制學(xué)習(xí)總結(jié)
書中說明了InnoDB一種簡單的實(shí)現(xiàn)方式,這種方式是采用一條記錄多個(gè)版本的方式,每條記錄上增加了兩個(gè)隱藏列,一個(gè)是創(chuàng)建版本號(hào),一個(gè)是刪除版本號(hào),每開啟一個(gè)事務(wù)都會(huì)分配一個(gè)事務(wù)版本號(hào),事務(wù)版本號(hào)...
微信掃碼,在手機(jī)上查看選中內(nèi)容