當(dāng)前位置:首頁(yè) > 芯聞號(hào) > 充電吧
[導(dǎo)讀]這段時(shí)間由于開(kāi)發(fā)項(xiàng)目,重新學(xué)習(xí)了數(shù)據(jù)庫(kù)的并發(fā)控制和鎖機(jī)制。數(shù)據(jù)庫(kù)就是通過(guò)鎖機(jī)制來(lái)解決并發(fā)問(wèn)題的。。主要就是兩種鎖,共享鎖和排他鎖(也叫獨(dú)占鎖)。在執(zhí)行select語(yǔ)句的時(shí)候需要給操作對(duì)象(表或者一些記

這段時(shí)間由于開(kāi)發(fā)項(xiàng)目,重新學(xué)習(xí)了數(shù)據(jù)庫(kù)的并發(fā)控制和鎖機(jī)制。數(shù)據(jù)庫(kù)就是通過(guò)鎖機(jī)制來(lái)解決并發(fā)問(wèn)題的。。主要就是兩種鎖,共享鎖和排他鎖(也叫獨(dú)占鎖)。在執(zhí)行select語(yǔ)句的時(shí)候需要給操作對(duì)象(表或者一些記錄)加上共享鎖,但加鎖之前需要檢查是否有排他鎖,如果沒(méi)有,則可以加共享鎖(一個(gè)對(duì)象上可以加n個(gè)共享鎖),否則不行。共享鎖通常在執(zhí)行完select語(yǔ)句之后被釋放,當(dāng)然也有可能是在事務(wù)結(jié)束(包括正常結(jié)束和異常結(jié)束)的時(shí)候被釋放,主要取決與數(shù)據(jù)庫(kù)所設(shè)置的事務(wù)隔離級(jí)別。

  執(zhí)行insert、update、delete語(yǔ)句的時(shí)候需要給操作的對(duì)象加排他鎖(我感覺(jué)在執(zhí)行insert的時(shí)候應(yīng)該是在表級(jí)加排他鎖),在加排他鎖之前必須確認(rèn)該對(duì)象上沒(méi)有其他任何鎖,一旦加上排他鎖之后,就不能再給這個(gè)對(duì)象加其他任何鎖。排他鎖的釋放通常是在事務(wù)結(jié)束的時(shí)候(當(dāng)然也有例外,就是在數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別被設(shè)置成Read Uncommitted(讀未提交數(shù)據(jù))的時(shí)候,這種情況下排他鎖會(huì)在執(zhí)行完更新操作之后就釋放,而不是在事務(wù)結(jié)束的時(shí)候)。
  數(shù)據(jù)庫(kù)是支持在一個(gè)事務(wù)中進(jìn)行自動(dòng)鎖升級(jí)的,例如,在某個(gè)事務(wù)中先執(zhí)行select語(yǔ)句,后執(zhí)行update語(yǔ)句,這兩條語(yǔ)句操作了同一個(gè)對(duì)象,并且假定共享鎖是在事務(wù)結(jié)束的時(shí)候被釋放的。如果數(shù)據(jù)庫(kù)不支持自動(dòng)鎖升級(jí),那么當(dāng)update語(yǔ)句請(qǐng)求排他鎖的時(shí)候?qū)⒉荒艹晒?。因?yàn)橹皊elect語(yǔ)句的共享鎖沒(méi)有被釋放,那么事務(wù)就進(jìn)入了無(wú)限等待,即死鎖。有了自動(dòng)鎖升級(jí),在執(zhí)行update語(yǔ)句的時(shí)候就可以將之前加的共享鎖升級(jí)為排他鎖,但有個(gè)前提,就是這個(gè)共享鎖必須是本事務(wù)自己加的,而且在操作對(duì)象上沒(méi)有在加其他任何鎖,否則共享鎖是不能被升級(jí)為排他鎖的,必須等待其他鎖的釋放。
  在看《精通Hibernate》的時(shí)候,里面還提到了更新鎖。因?yàn)橥ǔT趫?zhí)行更新操作的時(shí)候要先查詢,也就是我們通常會(huì)在update語(yǔ)句和delete語(yǔ)句中加where子句。那么,有的數(shù)據(jù)庫(kù)系統(tǒng)可能會(huì)在執(zhí)行查詢的時(shí)候先給操作對(duì)象加共享鎖,然后在更新的時(shí)候加排他鎖,但這么做會(huì)有問(wèn)題,也就是如果兩個(gè)事務(wù)同時(shí)要更新一個(gè)對(duì)象,都先給這個(gè)對(duì)象加了共享鎖,當(dāng)要更新的時(shí)候,都請(qǐng)求升級(jí)鎖,但由于這個(gè)對(duì)象上存在對(duì)方事務(wù)加的共享鎖。。所以無(wú)法升級(jí)。這樣兩個(gè)事務(wù)就在等待對(duì)方釋放共享鎖,進(jìn)入死鎖狀態(tài)。更新鎖就是為了解決這個(gè)問(wèn)題,即在執(zhí)行查詢操作的時(shí)候加的不是共享鎖而是更新鎖(一個(gè)對(duì)象上只能有一個(gè)更新鎖和n個(gè)共享鎖),當(dāng)要更新的時(shí)候,再將更新鎖升級(jí)為排他鎖,升級(jí)前提是這個(gè)對(duì)象上只有本事務(wù)加的更新鎖,沒(méi)有其他任何鎖了。其實(shí),,我想,如果在執(zhí)行查詢的時(shí)候就給事務(wù)加排他鎖不也能解決死鎖問(wèn)題嗎,但這樣似乎會(huì)減弱系統(tǒng)的并發(fā)性能。
  現(xiàn)在說(shuō)說(shuō)數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別。
  在《精通Hibernate》中提到了4種數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別:
Read Uncommitted:讀未提交數(shù)據(jù)(這個(gè)通常很少用)
  使用這種隔離級(jí)別并不是說(shuō)在讀取或者更新數(shù)據(jù)的時(shí)候不加鎖。。其實(shí)還是加鎖的,只是在執(zhí)行完操作之后馬上釋放鎖。而不是等到事務(wù)結(jié)束之后再釋放。對(duì)于共享鎖,排他鎖都是這樣。
Read Committed:讀已提交數(shù)據(jù)(這個(gè)很常用,也常是數(shù)據(jù)庫(kù)默認(rèn)的設(shè)置)
  這種隔離級(jí)別共享鎖在讀取數(shù)據(jù)之后馬上釋放。。而排他鎖則是在事務(wù)結(jié)束的時(shí)候再釋放。
Repeatable Read:可重復(fù)讀
  這種隔離級(jí)別共享鎖和排他鎖都是在事務(wù)結(jié)束的時(shí)候再釋放的。因此叫“可重復(fù)讀”,即一個(gè)事務(wù)所讀取的數(shù)據(jù)是不會(huì)被別的事務(wù)更新的。。。在事務(wù)執(zhí)行過(guò)程中任何時(shí)候都可以讀取剛才讀過(guò)的數(shù)據(jù)。讀過(guò)的數(shù)據(jù)是不會(huì)被改變的,直到事務(wù)結(jié)束。
Serializable:串行化
  共享鎖和排他鎖也是在事務(wù)結(jié)束的時(shí)候被釋放,和Repeatable Read不同的是,通常,Repeatable Read。。在讀取數(shù)據(jù)的時(shí)候。。都是對(duì)一條條記錄加共享鎖的。而Serializable的共享鎖則是對(duì)整個(gè)表加的,這樣不但讀取的數(shù)據(jù)不會(huì)被別的事務(wù)修改。。。在同一個(gè)表中的其他未被讀取的數(shù)據(jù)也不會(huì)被修改,,甚至不用擔(dān)心讀到新加入這個(gè)表中的數(shù)據(jù)(根本無(wú)法往表中加數(shù)據(jù)),所以這種隔離級(jí)別是不會(huì)出現(xiàn)虛讀的。


以下一篇來(lái)自點(diǎn)擊打開(kāi)鏈接

鎖是網(wǎng)絡(luò)數(shù)據(jù)庫(kù)中的一個(gè)非常重要的概念,它主要用于多用戶環(huán)境下保證數(shù)據(jù)庫(kù)完整性和一致性。各種大型數(shù) 據(jù)庫(kù)所采用的鎖的基本理論是一致的,但在具體實(shí)現(xiàn)上各有差別。目前,大多數(shù)數(shù)據(jù)庫(kù)管理系統(tǒng)都或多或少具有自我調(diào)節(jié)、自我管理的功能,因此很多用戶實(shí)際上不 清楚鎖的理論和所用數(shù)據(jù)庫(kù)中鎖的具體實(shí)現(xiàn)。?

Microsoft SQL Server(以下簡(jiǎn)稱SQL Server)作為一種中小型數(shù)據(jù)庫(kù)管理系統(tǒng),已經(jīng)得到了廣泛的應(yīng)用,該系統(tǒng)更強(qiáng)調(diào)由系統(tǒng)來(lái)管理鎖。在用戶有SQL請(qǐng)求時(shí),系統(tǒng)分析請(qǐng)求,自動(dòng)在滿足鎖定 條件和系統(tǒng)性能之間為數(shù)據(jù)庫(kù)加上適當(dāng)?shù)逆i,同時(shí)系統(tǒng)在運(yùn)行期間常常自動(dòng)進(jìn)行優(yōu)化處理,實(shí)行動(dòng)態(tài)加鎖。對(duì)于一般的用戶而言,通過(guò)系統(tǒng)的自動(dòng)鎖定管理機(jī)制基本 可以滿足使用要求,但如果對(duì)數(shù)據(jù)安全、數(shù)據(jù)庫(kù)完整性和一致性有特殊要求,就必須自己控制數(shù)據(jù)庫(kù)的鎖定和解鎖,這就需要了解SQL Server的鎖機(jī)制,掌握數(shù)據(jù)庫(kù)鎖定方法。?

鎖的多粒度性以及鎖升級(jí)?

數(shù)據(jù)庫(kù)中的鎖是指一種軟件機(jī)制,用來(lái)指示某個(gè)用 戶(也即進(jìn)程會(huì)話,下同)已經(jīng)占用了某種資源,從而防止其他用戶做出影響本用戶的數(shù)據(jù)修改或?qū)е聰?shù)據(jù)庫(kù)數(shù)據(jù)的非完整性和非一致性。這兒所謂資源,主要指用 戶可以操作的數(shù)據(jù)行、索引以及數(shù)據(jù)表等。根據(jù)資源的不同,鎖有多粒度(multigranular)的概念,也就是指可以鎖定的資源的層次。SQL Server中能夠鎖定的資源粒度包括:數(shù)據(jù)庫(kù)、表、區(qū)域、頁(yè)面、鍵值(指帶有索引的行數(shù)據(jù))、行標(biāo)識(shí)符(RID,即表中的單行數(shù)據(jù))。?

采 用多粒度鎖的重要用途是用來(lái)支持并發(fā)操作和保證數(shù)據(jù)的完整性。SQL Server根據(jù)用戶的請(qǐng)求,做出分析后自動(dòng)給數(shù)據(jù)庫(kù)加上合適的鎖。假設(shè)某用戶只操作一個(gè)表中的部分行數(shù)據(jù),系統(tǒng)可能會(huì)只添加幾個(gè)行鎖(RID)或頁(yè)面 鎖,這樣可以盡可能多地支持多用戶的并發(fā)操作。但是,如果用戶事務(wù)中頻繁對(duì)某個(gè)表中的多條記錄操作,將導(dǎo)致對(duì)該表的許多記錄行都加上了行級(jí)鎖,數(shù)據(jù)庫(kù)系統(tǒng) 中鎖的數(shù)目會(huì)急劇增加,這樣就加重了系統(tǒng)負(fù)荷,影響系統(tǒng)性能。因此,在數(shù)據(jù)庫(kù)系統(tǒng)中,一般都支持鎖升級(jí)(lock escalation)。所謂鎖升級(jí)是指調(diào)整鎖的粒度,將多個(gè)低粒度的鎖替換成少數(shù)的更高粒度的鎖,以此來(lái)降低系統(tǒng)負(fù)荷。在SQL Server中當(dāng)一個(gè)事務(wù)中的鎖較多,達(dá)到鎖升級(jí)門(mén)限時(shí),系統(tǒng)自動(dòng)將行級(jí)鎖和頁(yè)面鎖升級(jí)為表級(jí)鎖。特別值得注意的是,在SQL Server中,鎖的升級(jí)門(mén)限以及鎖升級(jí)是由系統(tǒng)自動(dòng)來(lái)確定的,不需要用戶設(shè)置。?

鎖的模式和兼容性?

在數(shù)據(jù)庫(kù)中加鎖時(shí),除了可以對(duì)不同的資源加鎖,還可以使用不同程度的加鎖方式,即鎖有多種模式,SQL Server中鎖模式包括:?

1.共享鎖?

SQL Server中,共享鎖用于所有的只讀數(shù)據(jù)操作。共享鎖是非獨(dú)占的,允許多個(gè)并發(fā)事務(wù)讀取其鎖定的資源。默認(rèn)情況下,數(shù)據(jù)被讀取后,SQL Server立即釋放共享鎖。例如,執(zhí)行查詢“SELECT * FROM my_table”時(shí),首先鎖定第一頁(yè),讀取之后,釋放對(duì)第一頁(yè)的鎖定,然后鎖定第二頁(yè)。這樣,就允許在讀操作過(guò)程中,修改未被鎖定的第一頁(yè)。但是,事務(wù) 隔離級(jí)別連接選項(xiàng)設(shè)置和SELECT語(yǔ)句中的鎖定設(shè)置都可以改變SQL Server的這種默認(rèn)設(shè)置。例如,“ SELECT * FROM my_table HOLDLOCK”就要求在整個(gè)查詢過(guò)程中,保持對(duì)表的鎖定,直到查詢完成才釋放鎖定。?

2.修改鎖?

修 改鎖在修改操作的初始化階段用來(lái)鎖定可能要被修改的資源,這樣可以避免使用共享鎖造成的死鎖現(xiàn)象。因?yàn)槭褂霉蚕礞i時(shí),修改數(shù)據(jù)的操作分為兩步,首先獲得一 個(gè)共享鎖,讀取數(shù)據(jù),然后將共享鎖升級(jí)為獨(dú)占鎖,然后再執(zhí)行修改操作。這樣如果同時(shí)有兩個(gè)或多個(gè)事務(wù)同時(shí)對(duì)一個(gè)事務(wù)申請(qǐng)了共享鎖,在修改數(shù)據(jù)的時(shí)候,這些 事務(wù)都要將共享鎖升級(jí)為獨(dú)占鎖。這時(shí),這些事務(wù)都不會(huì)釋放共享鎖而是一直等待對(duì)方釋放,這樣就造成了死鎖。如果一個(gè)數(shù)據(jù)在修改前直接申請(qǐng)修改鎖,在數(shù)據(jù)修 改的時(shí)候再升級(jí)為獨(dú)占鎖,就可以避免死鎖。修改鎖與共享鎖是兼容的,也就是說(shuō)一個(gè)資源用共享鎖鎖定后,允許再用修改鎖鎖定。?

3.獨(dú)占鎖?

獨(dú)占鎖是為修改數(shù)據(jù)而保留的。它所鎖定的資源,其他事務(wù)不能讀取也不能修改。獨(dú)占鎖不能和其他鎖兼容。?

4.結(jié)構(gòu)鎖?

結(jié)構(gòu)鎖分為結(jié)構(gòu)修改鎖(Sch-M)和結(jié)構(gòu)穩(wěn)定鎖(Sch-S)。執(zhí)行表定義語(yǔ)言操作時(shí),SQL Server采用Sch-M鎖,編譯查詢時(shí),SQL Server采用Sch-S鎖。?

5.意向鎖?

意 向鎖說(shuō)明SQL Server有在資源的低層獲得共享鎖或獨(dú)占鎖的意向。例如,表級(jí)的共享意向鎖說(shuō)明事務(wù)意圖將獨(dú)占鎖釋放到表中的頁(yè)或者行。意向鎖又可以分為共享意向鎖、 獨(dú)占意向鎖和共享式獨(dú)占意向鎖。共享意向鎖說(shuō)明事務(wù)意圖在共享意向鎖所鎖定的低層資源上放置共享鎖來(lái)讀取數(shù)據(jù)。獨(dú)占意向鎖說(shuō)明事務(wù)意圖在共享意向鎖所鎖定 的低層資源上放置獨(dú)占鎖來(lái)修改數(shù)據(jù)。共享式獨(dú)占鎖說(shuō)明事務(wù)允許其他事務(wù)使用共享鎖來(lái)讀取頂層資源,并意圖在該資源低層上放置獨(dú)占鎖。?

6.批量修改鎖?

批量復(fù)制數(shù)據(jù)時(shí)使用批量修改鎖??梢酝ㄟ^(guò)表的TabLock提示或者使用系統(tǒng)存儲(chǔ)過(guò)程sp_tableoption的“table lock on bulk load”選項(xiàng)設(shè)定批量修改鎖。?

另外,SQL Server命令語(yǔ)句操作會(huì)影響鎖定的方式,語(yǔ)句的組合也同樣能產(chǎn)生不同的鎖定,詳情如下表:?

鎖沖突及其防止辦法?

在數(shù)據(jù)庫(kù)系統(tǒng)中,死鎖是指多個(gè)用戶(進(jìn)程)分別鎖定了一個(gè)資源,并又試圖請(qǐng)求鎖定對(duì)方已經(jīng)鎖定的資源,這就產(chǎn)生了一個(gè)鎖定請(qǐng)求環(huán),導(dǎo)致多個(gè)用戶(進(jìn)程)都處于等待對(duì)方釋放所鎖定資源的狀態(tài)。?

在SQL Server中,系統(tǒng)能夠自動(dòng)定期搜索和處理死鎖問(wèn)題。系統(tǒng)在每次搜索中標(biāo)識(shí)所有等待鎖定請(qǐng)求的進(jìn)程會(huì)話,如果在下一次搜索中該被標(biāo)識(shí)的進(jìn)程仍處于等待狀態(tài),SQL Server就開(kāi)始遞歸死鎖搜索。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉