对比Oracle和Mysql在锁机制上的类似和差异点
轉(zhuǎn):https://blog.csdn.net/c332472988/article/details/52804078
InnoDB行鎖實(shí)現(xiàn)方式
 InnoDB行鎖是通過(guò)給索引上的索引項(xiàng)加鎖來(lái)實(shí)現(xiàn)的,這一點(diǎn)MySQL與Oracle不同,后者是通過(guò)在數(shù)據(jù)塊中對(duì)相應(yīng)數(shù)據(jù)行加鎖來(lái)實(shí)現(xiàn)的。InnoDB這種行鎖實(shí)現(xiàn)特點(diǎn)意味著:只有通過(guò)索引條件檢索數(shù)據(jù),InnoDB才使用行級(jí)鎖,否則,InnoDB將使用表鎖!
在進(jìn)一步分析Hadoop相關(guān)的分布式事務(wù)和鎖的機(jī)制前,有必要先整理和對(duì)比分析一下RDBMS領(lǐng)域最紅的兩大領(lǐng)軍人物
Oracle VS Mysql
1:事務(wù)隔離級(jí)別
oracle默認(rèn)為Read committed
Mysql的InnoDB默認(rèn)為Repeatable Read.
2:鎖類(lèi)別
oracle
內(nèi)部級(jí)封鎖(對(duì)外不公布,無(wú)法了解)
DDL鎖(對(duì)數(shù)據(jù)字典、詞法分析封鎖)
細(xì)分:(1)、字典操作鎖:用于對(duì)字典操作時(shí),鎖住數(shù)據(jù)字典,此封鎖是獨(dú)占的,從而保護(hù)任何一個(gè)時(shí)刻僅能對(duì)一個(gè)字典操作。?
   ?(2)、字典定義鎖:用于防止在進(jìn)行字典操作時(shí)又進(jìn)行語(yǔ)法分析,這樣可以避免在查詢(xún)字典的同時(shí)改動(dòng)某個(gè)表的結(jié)構(gòu)。?
   ?(3)、表定義鎖:用于 一個(gè)?SQL?語(yǔ)句正當(dāng)訪問(wèn)某個(gè)表時(shí),防止字典中與該表有關(guān)的項(xiàng)目被修改。?
DML鎖(對(duì)數(shù)據(jù)控制操作進(jìn)行鎖定)
細(xì)分包括:
?(1)共享鎖 (2)獨(dú)占鎖 (3)共享更新鎖
另外:Oracle的所在另外一個(gè)層面還可以劃分為兩大類(lèi)
悲觀鎖:
鎖在用戶(hù)修改之前就發(fā)揮作用:?
 Select ..for update?(?nowait)?
 Select * from tab1 for update?
樂(lè)觀鎖:
樂(lè)觀的認(rèn)為數(shù)據(jù)在?select?出來(lái)到?update?進(jìn)取并提交的這段時(shí)間數(shù)據(jù)不會(huì)被更改。這里面有一種潛在的危險(xiǎn)就是由于被選出的結(jié)果集并沒(méi)有被鎖定,是存在一種可能被其他用戶(hù)更改的可能。因此Oracle?仍然建議是用悲觀封鎖,因?yàn)檫@樣會(huì)更安全。
myql
表級(jí)鎖定(系統(tǒng)缺省,MyISAM,Memory,CSV)
?? 分為:讀鎖、寫(xiě)鎖
行級(jí)鎖定(InnoDB,NDB Cluster)
?? 獨(dú)占鎖、共享鎖、意向獨(dú)占鎖、意向共享鎖,InnoDB由于實(shí)現(xiàn)機(jī)制方式,具有【間隙鎖】
頁(yè)級(jí)鎖定(Berkeley DB)
?
上述所的開(kāi)銷(xiāo)如何呢,對(duì)應(yīng)的適合場(chǎng)景如何?
規(guī)則:
1:鎖的對(duì)象粒度跟并行度成反比
2:所得粒度大小跟所需的成本成反比
所以可以基本得出:
a:獨(dú)占鎖更安全,但是并發(fā)性低
b:樂(lè)觀鎖,支持并發(fā)更高,但是需要業(yè)務(wù)來(lái)適應(yīng)鎖出現(xiàn)的問(wèn)題
c:行鎖粒度更小,支持更小的并發(fā)性,但是對(duì)應(yīng)的資源消耗也必將高
?
注意Oracle的鎖機(jī)制跟Mysql的類(lèi)似點(diǎn)
?DML?鎖的三種封鎖方式:?
 (?1?)、共享封鎖方式(?SHARE?)?
 (?2?)、獨(dú)占封鎖方式(?EXCLUSIVE?)?
 (?3?)、共享更新封鎖(?SHARE UPDATE?)?
 其中?SHARE?,?EXCLUSIVE?用于表封鎖,?SHARE UPDATE?用于行封鎖。?
注意:在Mysql中
共享鎖在行級(jí)別上應(yīng)該也可以支持
獨(dú)占鎖在列上也應(yīng)該可以支持
?
另外一點(diǎn):Oracle需要區(qū)分另外幾類(lèi)鎖的規(guī)則:
Oracle的TX鎖(行級(jí)鎖、事務(wù)鎖)
 TX的本義是Transaction(事務(wù)),當(dāng)一個(gè)事務(wù)第一次執(zhí)行數(shù)據(jù)更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE語(yǔ)句進(jìn)行查詢(xún)時(shí),它即獲得一個(gè)TX(事務(wù))鎖,直至該事務(wù)結(jié)束(執(zhí)行COMMIT或ROLLBACK操作)時(shí),該鎖才被釋放。所以,一個(gè)TX鎖,可以對(duì)應(yīng)多個(gè)被該事務(wù)鎖定的數(shù)據(jù)行。
TM鎖(表級(jí)鎖)
意向鎖:
 表是由行組成的,當(dāng)我們向某個(gè)表加鎖時(shí),一方面需要檢查該鎖的申請(qǐng)是否與原有的表級(jí)鎖相容;
另一方面,還要檢查該鎖是否與表中的每一行上的鎖相容。
比如一個(gè)事務(wù)要在一個(gè)表上加S鎖,如果表中的一行已被另外的事務(wù)加了X鎖,那么該鎖的申請(qǐng)也應(yīng)被阻塞。
如果表中的數(shù)據(jù)很多,逐行檢查鎖標(biāo)志的開(kāi)銷(xiāo)將很大,系統(tǒng)的性能將會(huì)受到影響。
為了解決這個(gè)問(wèn)題,可以在表級(jí)引入新的鎖類(lèi)型來(lái)表示其所屬行的加鎖情況,這就引出了“意向鎖”的概念。
 意向鎖的含義是如果對(duì)一個(gè)結(jié)點(diǎn)加意向鎖,則說(shuō)明該結(jié)點(diǎn)的下層結(jié)點(diǎn)正在被加鎖;對(duì)任一結(jié)點(diǎn)加鎖時(shí),必須先對(duì)它的上層結(jié)點(diǎn)加意向鎖。
如:對(duì)表中的任一行加鎖時(shí),必須先對(duì)它所在的表加意向鎖,然后再對(duì)該行加鎖。這樣一來(lái),事務(wù)對(duì)表加鎖時(shí),就不再需要檢查表中每行記錄的鎖標(biāo)志位了,系統(tǒng)效率得以大大提高。
?
意向鎖的類(lèi)型:
 由兩種基本的鎖類(lèi)型(S鎖、X鎖),可以自然地派生出兩種意向鎖:
 意向共享鎖(Intent Share Lock,簡(jiǎn)稱(chēng)IS鎖):如果要對(duì)一個(gè)數(shù)據(jù)庫(kù)對(duì)象加S鎖,首先要對(duì)其上級(jí)結(jié)點(diǎn)加IS鎖,表示它的后裔結(jié)點(diǎn)擬(意向)加S鎖;
 意向排它鎖(Intent Exclusive Lock,簡(jiǎn)稱(chēng)IX鎖):如果要對(duì)一個(gè)數(shù)據(jù)庫(kù)對(duì)象加X(jué)鎖,首先要對(duì)其上級(jí)結(jié)點(diǎn)加IX鎖,表示它的后裔結(jié)點(diǎn)擬(意向)加X(jué)鎖。
基本的鎖類(lèi)型(S、X)與意向鎖類(lèi)型(IS、IX)之間還可以組合出新的鎖類(lèi)型,理論上可以組合出4種,
即:S+IS,S+IX,X+IS,X+IX,但稍加分析不難看出,實(shí)際上只有S+IX有新的意義,其它三種組合都沒(méi)有使鎖的強(qiáng)度得到提高(即:S+IS=S,X+IS=X,X+IX=X,這里的“=”指鎖的強(qiáng)度相同)。所謂鎖的強(qiáng)度是指對(duì)其它鎖的排斥程度。
共享意向排它鎖(Shared Intent Exclusive Lock,簡(jiǎn)稱(chēng)SIX鎖) :如果對(duì)一個(gè)數(shù)據(jù)庫(kù)對(duì)象加SIX鎖,表示對(duì)它加S鎖,再加IX鎖,即SIX=S+IX。例如:事務(wù)對(duì)某個(gè)表加SIX鎖,則表示該事務(wù)要讀整個(gè)表(所以要對(duì)該表加S鎖),同時(shí)會(huì)更新個(gè)別行(所以要對(duì)該表加IX鎖)。
?
貌似看起來(lái)比較亂,差異就在于兩者對(duì)鎖的實(shí)現(xiàn)具體技術(shù)和設(shè)計(jì)理念的差異:
Oracle對(duì)鎖的設(shè)計(jì)更加極致和全面,實(shí)現(xiàn)技術(shù)方面更加全面,但是不公開(kāi)細(xì)節(jié)
Mysql明確支持2到3種,而且不同的存儲(chǔ)引擎各有所專(zhuān)場(chǎng),雖然不如oracle的全面,但是靈活運(yùn)用還是可以滿足需要,并且可能超出想象。
?
?查看鎖的方式:
oracle:
 1.查哪個(gè)過(guò)程被鎖
 查V$DB_OBJECT_CACHE視圖:
 SELECT * FROM V$DB_OBJECT_CACHE WHERE OWNER=''過(guò)程的所屬用戶(hù)'' AND LOCKS!=''0'';
2. 查是哪一個(gè)SID,通過(guò)SID可知道是哪個(gè)SESSION.
 查V$ACCESS視圖:
 SELECT * FROM V$ACCESS WHERE OWNER=''過(guò)程的所屬用戶(hù)'' AND NAME=''剛才查到的過(guò)程名
?
mysql:
MyISAM的查看機(jī)制
table_locks_immediated和table_locks_waited.
InnoDB的
innodb_row_lock_current_waits
innodb_row_lock_time
innodb_row_lock_time_avg
innodb_row_lock_time_max
innodb_row_lock_waits
?
總結(jié)
以上是生活随笔為你收集整理的对比Oracle和Mysql在锁机制上的类似和差异点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: # 遍历删除字典元素_第六章 字典
 - 下一篇: 软考论文答题纸PDF