悲觀鎖
在關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)里刷喜,悲觀并發(fā)控制(又名“悲觀鎖”,Pessimistic Concurrency Control剔氏,縮寫“PCC”)是一種并發(fā)控制的方法酗宋。它可以阻止一個(gè)事務(wù)以影響其他用戶的方式來修改數(shù)據(jù)威恼。如果一個(gè)事務(wù)執(zhí)行的操作都某行數(shù)據(jù)應(yīng)用了鎖品姓,那只有當(dāng)這個(gè)事務(wù)把鎖釋放,其他事務(wù)才能夠執(zhí)行與該鎖沖突的操作沃测。
悲觀并發(fā)控制主要用于數(shù)據(jù)爭(zhēng)用激烈的環(huán)境缭黔,以及發(fā)生并發(fā)沖突時(shí)使用鎖保護(hù)數(shù)據(jù)的成本要低于回滾事務(wù)的成本的環(huán)境中。
悲觀鎖蒂破,正如其名馏谨,它指的是對(duì)數(shù)據(jù)被外界(包括本系統(tǒng)當(dāng)前的其他事務(wù),以及來自外部系統(tǒng)的事務(wù)處理)修改持保守態(tài)度(悲觀)附迷,因此惧互,在整個(gè)數(shù)據(jù)處理過程中,將數(shù)據(jù)處于鎖定狀態(tài)喇伯。 悲觀鎖的實(shí)現(xiàn)喊儡,往往依靠數(shù)據(jù)庫(kù)提供的鎖機(jī)制 (也只有數(shù)據(jù)庫(kù)層提供的鎖機(jī)制才能真正保證數(shù)據(jù)訪問的排他性,否則稻据,即使在本系統(tǒng)中實(shí)現(xiàn)了加鎖機(jī)制艾猜,也無法保證外部系統(tǒng)不會(huì)修改數(shù)據(jù)).
悲觀鎖,假定會(huì)發(fā)生并發(fā)沖突,屏蔽一切可能違反數(shù)據(jù)完整性的操作。悲觀鎖假定其他用戶企圖訪問或者改變你正在訪問匆赃、更改的對(duì)象的概率是很高的淤毛,因此在悲觀鎖的環(huán)境中,在你開始改變此對(duì)象之前就將該對(duì)象鎖住算柳,并且直到你提交了所作的更改之后才釋放鎖低淡。悲觀的缺陷是不論是頁(yè)鎖還是行鎖,加鎖的時(shí)間可能會(huì)很長(zhǎng)瞬项,這樣可能會(huì)長(zhǎng)時(shí)間的限制其他用戶的訪問蔗蹋,也就是說悲觀鎖的并發(fā)訪問性不好。
悲觀鎖應(yīng)用
- 需要使用數(shù)據(jù)庫(kù)的鎖機(jī)制
樂觀鎖
在關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)里囱淋,樂觀并發(fā)控制(又名“樂觀鎖”猪杭,Optimistic Concurrency Control,縮寫“OCC”)是一種并發(fā)控制的方法绎橘。它假設(shè)多用戶并發(fā)的事務(wù)在處理時(shí)不會(huì)彼此互相影響胁孙,各事務(wù)能夠在不產(chǎn)生鎖的情況下處理各自影響的那部分?jǐn)?shù)據(jù)唠倦。在提交數(shù)據(jù)更新之前称鳞,每個(gè)事務(wù)會(huì)先檢查在該事務(wù)讀取數(shù)據(jù)后,有沒有其他事務(wù)又修改了該數(shù)據(jù)稠鼻。如果其他事務(wù)有更新的話冈止,正在提交的事務(wù)會(huì)進(jìn)行回滾。樂觀事務(wù)控制最早是由孔祥重(H.T.Kung)教授提出候齿。
樂觀鎖( Optimistic Locking ) 相對(duì)悲觀鎖而言熙暴,樂觀鎖假設(shè)認(rèn)為數(shù)據(jù)一般情況下不會(huì)造成沖突,所以在數(shù)據(jù)進(jìn)行提交更新的時(shí)候慌盯,才會(huì)正式對(duì)數(shù)據(jù)的沖突與否進(jìn)行檢測(cè)周霉,如果發(fā)現(xiàn)沖突了,則讓返回用戶錯(cuò)誤的信息亚皂,讓用戶決定如何去做俱箱。
樂觀鎖,假設(shè)不會(huì)發(fā)生并發(fā)沖突,只在提交操作時(shí)檢查是否違反數(shù)據(jù)完整性灭必。樂觀鎖不能解決臟讀的問題狞谱。樂觀鎖則認(rèn)為其他用戶企圖改變你正在更改的對(duì)象的概率是很小的,因此樂觀鎖直到你準(zhǔn)備提交所作的更改時(shí)才將對(duì)象鎖住禁漓,當(dāng)你讀取以及改變?cè)搶?duì)象時(shí)并不加鎖跟衅。可見樂觀鎖加鎖的時(shí)間要比悲觀鎖短播歼,樂觀鎖可以用較大的鎖粒度獲得較好的并發(fā)訪問性能伶跷。但是如果第二個(gè)用戶恰好在第一個(gè)用戶提交更改之前讀取了該對(duì)象,那么當(dāng)他完成了自己的更改進(jìn)行提交時(shí),數(shù)據(jù)庫(kù)就會(huì)發(fā)現(xiàn)該對(duì)象已經(jīng)變化了叭莫,這樣磷支,第二個(gè)用戶不得不重新讀取該對(duì)象并作出更改。這說明在樂觀鎖環(huán)境中食寡,會(huì)增加并發(fā)用戶讀取對(duì)象的次數(shù)雾狈。
樂觀鎖應(yīng)用
- 使用版本號(hào)
- 使用時(shí)間戳
樂觀鎖與悲觀鎖的優(yōu)點(diǎn)和缺點(diǎn)
悲觀并發(fā)控制實(shí)際上是“先取鎖再訪問”的保守策略,為數(shù)據(jù)處理的安全提供了保證抵皱。但是在效率方面善榛,處理加鎖的機(jī)制會(huì)讓數(shù)據(jù)庫(kù)產(chǎn)生額外的開銷,還有增加產(chǎn)生死鎖的機(jī)會(huì)呻畸;另外移盆,在只讀型事務(wù)處理中由于不會(huì)產(chǎn)生沖突,也沒必要使用鎖伤为,這樣做只能增加系統(tǒng)負(fù)載咒循;還有會(huì)降低了并行性,一個(gè)事務(wù)如果鎖定了某行數(shù)據(jù)绞愚,其他事務(wù)就必須等待該事務(wù)處理完才可以處理那行數(shù)
樂觀并發(fā)控制相信事務(wù)之間的數(shù)據(jù)競(jìng)爭(zhēng)(data race)的概率是比較小的叙甸,因此盡可能直接做下去,直到提交的時(shí)候才去鎖定位衩,所以不會(huì)產(chǎn)生任何鎖和死鎖裆蒸。但如果直接簡(jiǎn)單這么做腹侣,還是有可能會(huì)遇到不可預(yù)期的結(jié)果郊艘,例如兩個(gè)事務(wù)都讀取了數(shù)據(jù)庫(kù)的某一行,經(jīng)過修改以后寫回?cái)?shù)據(jù)庫(kù)吼蚁,這時(shí)就遇到了問題贮缕。
從數(shù)據(jù)庫(kù)廠商的角度看辙谜,使用樂觀的頁(yè)鎖是比較好的,尤其在影響很多行的批量操作中可以放比較少的鎖感昼,從而降低對(duì)資源的需求提高數(shù)據(jù)庫(kù)的性能装哆。再考慮聚集索引。在數(shù)據(jù)庫(kù)中記錄是按照聚集索引的物理順序存放的抑诸。如果使用頁(yè)鎖烂琴,當(dāng)兩個(gè)用戶同時(shí)訪問更改位于同一數(shù)據(jù)頁(yè)上的相鄰兩行時(shí),其中一個(gè)用戶必須等待另一個(gè)用戶釋放鎖蜕乡,這會(huì)明顯地降低系統(tǒng)的性能奸绷。interbase和大多數(shù)關(guān)系數(shù)據(jù)庫(kù)一樣,采用的是樂觀鎖层玲,而且讀鎖是共享的号醉,寫鎖是排他的反症。可以在一個(gè)讀鎖上再放置讀鎖畔派,但不能再放置寫鎖铅碍;你不能在寫鎖上再放置任何鎖。鎖是目前解決多用戶并發(fā)訪問的有效手段线椰。
在實(shí)際生產(chǎn)環(huán)境里邊,如果并發(fā)量不大且不允許臟讀胞谈,可以使用悲觀鎖解決并發(fā)問題;但如果系統(tǒng)的并發(fā)非常大的話,悲觀鎖定會(huì)帶來非常大的性能問題,所以我們就要選擇樂觀鎖定的方法.