日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

mysql鎖機(jī)制總結(jié)

 昵稱10504424 2014-01-23

1.隔離級(jí)別

(1)讀不提交(Read Uncommited,RU)

這種隔離級(jí)別下,事務(wù)間完全不隔離,會(huì)產(chǎn)生臟讀,可以讀取未提交的記錄,實(shí)際情況下不會(huì)使用。

(2)讀提交(Read commitedRC)

僅能讀取到已提交的記錄,這種隔離級(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í)別。

說明:

  1. 對(duì)于更新操作(讀不上鎖),只有走索引才可能上行鎖;否則會(huì)對(duì)聚簇索引的每一行上寫鎖,實(shí)際等同于對(duì)表上寫鎖。
  2. 若多個(gè)物理記錄對(duì)應(yīng)同一個(gè)索引,若同時(shí)訪問,也會(huì)出現(xiàn)鎖沖突;
  3. 當(dāng)表有多個(gè)索引時(shí),不同事務(wù)可以用不同的索引鎖住不同的行,另外innodb會(huì)同時(shí)用行鎖對(duì)數(shù)據(jù)記錄(聚簇索引)加鎖。
  4. MVCC并發(fā)控制機(jī)制下,任何操作都不會(huì)阻塞讀操作,讀操作也不會(huì)阻塞任何操作,只因?yàn)樽x不上鎖。

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:///?p=771

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多