并發(fā)控制課件_第1頁(yè)
并發(fā)控制課件_第2頁(yè)
并發(fā)控制課件_第3頁(yè)
并發(fā)控制課件_第4頁(yè)
并發(fā)控制課件_第5頁(yè)
已閱讀5頁(yè),還剩143頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第12章并發(fā)控制本章導(dǎo)讀:為了避免多用戶并行存取數(shù)據(jù)庫(kù)時(shí),破壞事物的完整性和數(shù)據(jù)的一致性,SQLServer提供了并發(fā)控制機(jī)制。并發(fā)控制機(jī)制主要通過(guò)事務(wù)隔離級(jí)別和封鎖機(jī)制來(lái)調(diào)度并發(fā)事務(wù)的執(zhí)行,使一個(gè)事務(wù)的執(zhí)行不受其它事務(wù)的干擾。知識(shí)要點(diǎn):SQLServer登錄 事務(wù)處理 并發(fā)訪問(wèn) 鎖 事物隔離級(jí)別12.1事務(wù)處理12.2并發(fā)訪問(wèn)12.3鎖12.4事務(wù)隔離級(jí)別第12章并發(fā)控制本章導(dǎo)讀:12.1事務(wù)處理SQLServer提供了一種事務(wù)處理的機(jī)制,用于確保數(shù)據(jù)的一致性和完整性。在事務(wù)處理過(guò)程中,所有操作序列都作為一個(gè)獨(dú)立的邏輯單元被執(zhí)行。只有所有操作序列都正確地執(zhí)行完畢,事物處理才算成功提交,否則就回滾(撤銷)到事物處理前的數(shù)據(jù)狀態(tài)。12.1.1事務(wù)概述12.1.2事物模式12.1事務(wù)處理SQLServer提供了一種事務(wù)處理的12.1.1事務(wù)概述事務(wù)(Transaction)是一組不可分割的、可執(zhí)行的動(dòng)作序列,是數(shù)據(jù)處理的邏輯單元,其包含的動(dòng)作序列具有一定的偏序,即部分關(guān)鍵動(dòng)作序列的順序很重要,會(huì)影響事物運(yùn)行結(jié)果。事物是恢復(fù)和并發(fā)的基本單位。1.事物特性事務(wù)可以是一條或一組SQL語(yǔ)句,也可以是整個(gè)應(yīng)用程序,而一個(gè)應(yīng)用程序也可能包含多個(gè)事務(wù)。事務(wù)有4個(gè)特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續(xù)性(Durability),它們統(tǒng)稱為事務(wù)的ACID特性。(1)原子性:是指事務(wù)中操作序列邏輯上作為一個(gè)工作單元整體考慮,要么全都執(zhí)行,要么全都不執(zhí)行。(2)一致性:事務(wù)在完成時(shí),所有數(shù)據(jù)必須從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。在相關(guān)數(shù)據(jù)庫(kù)中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)都必須是正確的。(3)隔離性:是指一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)執(zhí)行的其他事務(wù)是隔離的。一個(gè)事務(wù)能查看到另一個(gè)事物的數(shù)據(jù)狀態(tài),要么是修改它之前的狀態(tài),要么是修改它之后的狀態(tài),不會(huì)是中間狀態(tài)的數(shù)據(jù)。(4)持續(xù)性:也稱永久性(Permanence),事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的,無(wú)論發(fā)生何種操作,即使出現(xiàn)系統(tǒng)故障也將一直保持磁盤上。12.1.1事務(wù)概述事務(wù)(Transaction)是一組12.1.1事務(wù)概述2.事物和批的區(qū)別一個(gè)事務(wù)中也可以擁有多個(gè)批,一個(gè)批里可以有多個(gè)SQL語(yǔ)句組成的事務(wù),事務(wù)內(nèi)批的多少不影響事務(wù)的提交或回滾操作。編寫應(yīng)用程序時(shí),一定要區(qū)分事務(wù)和批的差別:(1)批是一組整體編譯的SQL語(yǔ)句,事務(wù)是一組作為邏輯工作單元執(zhí)行的SQL語(yǔ)句。(2)批語(yǔ)句的組合發(fā)生在編譯時(shí)刻,事務(wù)中語(yǔ)句的組合發(fā)生在執(zhí)行時(shí)刻。(3)編譯時(shí),批中某條語(yǔ)句存在語(yǔ)法錯(cuò)誤,系統(tǒng)將終止批中所有語(yǔ)句;運(yùn)行時(shí),事務(wù)中某個(gè)數(shù)據(jù)修改違反約束、規(guī)則等,系統(tǒng)默認(rèn)只回退到產(chǎn)生該錯(cuò)誤的語(yǔ)句。12.1.1事務(wù)概述2.事物和批的區(qū)別12.1.2事物模式SQLServer中的事務(wù)模式包括3種工作方式:自動(dòng)提交事務(wù)、顯式事務(wù)和隱式事務(wù)。1.自動(dòng)提交事務(wù)自動(dòng)提交事務(wù)是由T-SQL語(yǔ)句的特點(diǎn)自動(dòng)劃分的事務(wù)。它是SQLServer的默認(rèn)模式,每條單獨(dú)的T-SQL語(yǔ)句都是一個(gè)事務(wù),自動(dòng)提交或回滾,無(wú)須指定任何控制語(yǔ)句控制事務(wù)。2.顯式事務(wù)顯式事務(wù)是由用戶顯式定義的事務(wù)。在顯式事務(wù)模式下,每個(gè)事物均以begintransaction語(yǔ)句定義事務(wù)開(kāi)始,用commit或rollback語(yǔ)句定義事務(wù)結(jié)束。主要事物控制語(yǔ)句如下:(1)begintransaction[事務(wù)名]:?jiǎn)?dòng)事務(wù);(2)committransaction[事務(wù)名]:提交事務(wù),提交的數(shù)據(jù)變成數(shù)據(jù)庫(kù)的永久部分;(3)rollbacktransaction[事務(wù)名]:回滾事務(wù),撤銷全部操作,回滾到事務(wù)開(kāi)始時(shí)狀態(tài);(4)savetransaction<事務(wù)名>:可選語(yǔ)句,在事務(wù)內(nèi)設(shè)置保存點(diǎn),可以使事物回滾到保存點(diǎn),而不是回滾到事務(wù)的起點(diǎn)。12.1.2事物模式SQLServer中的事務(wù)模式包括12.1.2事物模式【例12-1】定義一個(gè)事務(wù),向?qū)W生表中插入一條只包含學(xué)號(hào)、姓名和性別的記錄。usejxglgoselect次數(shù)=0,*from學(xué)生 --檢查當(dāng)前表的內(nèi)容gobegintransactioninsertinto學(xué)生(學(xué)號(hào),姓名,性別)values('11010101','司武長(zhǎng)','男')gosavetransactionlabelinsertinto學(xué)生(學(xué)號(hào),姓名,性別)values('11010101','那佳佳','女')select次數(shù)=1,*from學(xué)生 --顯示插入兩條記錄rollbacktransactionlabel --回滾到事物保存點(diǎn)

select次數(shù)=2,*from學(xué)生 --顯示第1次插入的記錄被撤銷了gorollbacktransactionselect次數(shù)=3,*from學(xué)生 --顯示第2次插入的記錄被撤銷了12.1.2事物模式【例12-1】定義一個(gè)事務(wù),向?qū)W生12.1.2事物模式3.隱式事務(wù)隱式事務(wù)是用setimplicittransactionson不明顯地定義事務(wù)開(kāi)始,用commit或rollback語(yǔ)句明顯地定義事務(wù)結(jié)束的事務(wù)。在隱式事務(wù)模式下,在當(dāng)前事務(wù)提交或回滾后,SQLServer自動(dòng)開(kāi)始下一個(gè)事務(wù)。主要事物模式設(shè)置語(yǔ)句如下:(1)設(shè)置隱性事務(wù)開(kāi)始模式:setimplicit_transactionson:?jiǎn)?dòng)隱性事務(wù)模式;setimplicit_transactionsoff:關(guān)閉隱性事務(wù)模式。(2)設(shè)置隱性事務(wù)回滾模式:setxact_aborton:當(dāng)事務(wù)中任一條語(yǔ)句運(yùn)行錯(cuò)誤時(shí),整個(gè)事務(wù)將終止并整體回滾;setxact_abortoff:當(dāng)事務(wù)中語(yǔ)句運(yùn)行錯(cuò)誤時(shí),將終止本條語(yǔ)句且只回滾本條語(yǔ)句。12.1.2事物模式3.隱式事務(wù)12.2并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)是允許多用戶同時(shí)使用的共享資源,當(dāng)多個(gè)事務(wù)并發(fā)訪問(wèn)(同時(shí)訪問(wèn)同一資源)時(shí),若不加控制就可能會(huì)彼此沖突,破壞了數(shù)據(jù)的完整性和一致性,從而產(chǎn)生負(fù)面影響。12.2.1并發(fā)概述12.2.2并發(fā)異常12.2.3并發(fā)調(diào)度12.2并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)是允許多用戶同時(shí)使用的共享資源,當(dāng)12.2.1并發(fā)概述如果事物是順序執(zhí)行的,即一個(gè)事物完成之后,再開(kāi)始另一個(gè)是事物,則稱這種執(zhí)行方式為串行執(zhí)行,如圖12-1a所示;如果數(shù)據(jù)庫(kù)管理系統(tǒng)可以同時(shí)接收多個(gè)事物,并且這些事物在時(shí)間上可以重疊執(zhí)行,則稱這種執(zhí)行方式為并行執(zhí)行。在單CPU系統(tǒng)中,同一時(shí)間只能有一個(gè)事物占據(jù)CPU。各事物交叉地使用CPU,這種并發(fā)方式交叉并發(fā)。在多CPU系統(tǒng)中,多個(gè)事物可以同時(shí)占據(jù)CPU,這種并發(fā)方式稱為同時(shí)并發(fā),如圖12-1b所示。在沒(méi)有特殊說(shuō)明的情況下,并發(fā)訪問(wèn)只考慮單CPU系統(tǒng)中的交叉并發(fā)的情況。12.2.1并發(fā)概述如果事物是順序執(zhí)行的,即一個(gè)事物完成12.2.1并發(fā)概述a)串行執(zhí)行 b)交叉并行執(zhí)行圖12-1多個(gè)事物的執(zhí)行情況12.2.1并發(fā)概述a)串行執(zhí)行 b)交叉并行執(zhí)行12.2.2并發(fā)異常并發(fā)訪問(wèn)帶來(lái)數(shù)據(jù)不一致性主要包括四類:丟失更新、不可重復(fù)讀、臟讀和幻讀。1.丟失更新(LostUpdate)丟失更新是指當(dāng)兩個(gè)或兩個(gè)以上的事物同時(shí)讀取同一數(shù)據(jù)并進(jìn)行修改,其中一個(gè)事物提交的修改結(jié)果破壞了另一個(gè)事物的提交的修改結(jié)果。丟失更新有兩類,分別介紹如下:(1)第一類丟失更新:一個(gè)事務(wù)在撤銷時(shí),把其它事務(wù)提交的更新數(shù)據(jù)覆蓋,如表12-1所示。12.2.2并發(fā)異常并發(fā)訪問(wèn)帶來(lái)數(shù)據(jù)不一致性主要包括四類12.2.2并發(fā)異常----第一類丟失更新12.2.2并發(fā)異常----第一類丟失更新12.2.2并發(fā)異常----第二類丟失更新(2)第二類丟失更新:一個(gè)事務(wù)在提交時(shí),把其它事務(wù)提交的更新數(shù)據(jù)覆蓋,如表12-2所示。表12-2第二類丟失更新12.2.2并發(fā)異常----第二類丟失更新(2)第二類丟12.2.2并發(fā)異常----2.臟讀(DirtyRead)2.臟讀(DirtyRead)臟讀就是指一個(gè)事務(wù)讀到另一事務(wù)尚未提交的更新數(shù)據(jù)(不正確的臨時(shí)數(shù)據(jù)),如表12-3所示。表12-3臟讀12.2.2并發(fā)異常----2.臟讀(DirtyRea12.2.2并發(fā)異常----不可重復(fù)讀3.不可重復(fù)讀(NonRepeatableRead)不可重復(fù)讀是指一個(gè)事務(wù)中在兩次讀取同一數(shù)據(jù)行的過(guò)程中,由于另一個(gè)事務(wù)的修改,導(dǎo)致了第一個(gè)事物兩次查詢結(jié)果不一樣,如表12-4所示。表12-4不可重復(fù)讀12.2.2并發(fā)異常----不可重復(fù)讀3.不可重復(fù)讀(N12.2.2并發(fā)異常----4.幻讀幻讀是指一個(gè)事務(wù)在執(zhí)行兩次查詢的過(guò)程中,由于另外一個(gè)事務(wù)插入或刪除了數(shù)據(jù)行,導(dǎo)致第一個(gè)事務(wù)的第二次查詢中發(fā)現(xiàn)新增或丟失數(shù)據(jù)行現(xiàn)象,如同幻覺(jué)一樣,如表12-5所示。表12-5幻讀12.2.2并發(fā)異常----4.幻讀幻讀是指一個(gè)事務(wù)在執(zhí)12.2.2并發(fā)異?;米x和不可重復(fù)讀的區(qū)別:幻讀是指讀到了其它事務(wù)已經(jīng)提交的新增數(shù)據(jù),而不可重復(fù)讀是指讀到了已經(jīng)提交事務(wù)的更改數(shù)據(jù);添加行級(jí)鎖,鎖定所操作的數(shù)據(jù),可防止讀取到更改數(shù)據(jù),而添加表級(jí)鎖,鎖定整個(gè)表,則可以防止新增數(shù)據(jù)。12.2.2并發(fā)異常幻讀和不可重復(fù)讀的區(qū)別:幻讀是指讀到12.2.3并發(fā)調(diào)度

并發(fā)事物中各事物的執(zhí)行順序和執(zhí)行時(shí)機(jī)一方面取決于事物自身內(nèi)部邏輯,另一方面也受到DBMS中事物調(diào)度機(jī)制的控制。并發(fā)訪問(wèn)時(shí),必須采取合適的調(diào)度機(jī)制來(lái)安排各個(gè)事務(wù)動(dòng)作流的執(zhí)行順序,以保證事務(wù)的ACID特性。根據(jù)事務(wù)調(diào)度的方式,并發(fā)調(diào)度分為兩種:串行調(diào)度和并行調(diào)度。1.串行調(diào)度若多個(gè)事務(wù)按完成順序依次執(zhí)行,則稱為事物的串行調(diào)度。12.2.3并發(fā)調(diào)度 并發(fā)事物中各事物的執(zhí)行順序和執(zhí)行12.2.3并發(fā)調(diào)度【例12-2】有甲、乙兩個(gè)售票窗,各賣出某一車次的硬座車票2張,臥鋪車票1張。設(shè)該車次的初始硬座車票數(shù)為A=50,臥鋪車票數(shù)為B=30,read()表示讀出數(shù)據(jù),write()表示寫入數(shù)據(jù)?,F(xiàn)將事務(wù)甲和事務(wù)乙串行執(zhí)行,則有表12-6和表12-7所示的兩種調(diào)度方法。12.2.3并發(fā)調(diào)度【例12-2】有甲、乙兩個(gè)售票窗,12.2.3并發(fā)調(diào)度注意:串行調(diào)度的結(jié)果總是正確的,但執(zhí)行效率低。12.2.3并發(fā)調(diào)度注意:串行調(diào)度的結(jié)果總是正確的,但執(zhí)12.2.3并發(fā)調(diào)度2.并行調(diào)度若多個(gè)事務(wù)同時(shí)交叉(分時(shí)的方法)地并行進(jìn)行,則稱為事物的并行調(diào)度?!纠?2-3】有甲乙兩個(gè)售票窗,各賣出某一車次的硬座車票2張,臥鋪車票1張。設(shè)該車次的初始硬座車票數(shù)為A=50,臥鋪車票數(shù)為B=30,read()表示讀出數(shù)據(jù),write()表示寫入數(shù)據(jù)。現(xiàn)將事務(wù)甲和事務(wù)乙并行執(zhí)行,則表12-8和表12-9列出兩種調(diào)度方法中的。12.2.3并發(fā)調(diào)度2.并行調(diào)度12.2.3并發(fā)調(diào)度12.2.3并發(fā)調(diào)度注意:并行調(diào)度中,一個(gè)事務(wù)的執(zhí)行可能會(huì)受到其它事務(wù)的干擾,調(diào)度的結(jié)果不一定正確,并行調(diào)度事物可以有效提高數(shù)據(jù)庫(kù)的性能,增加系統(tǒng)的吞吐量。12.2.3并發(fā)調(diào)度3.可串行化調(diào)度如果一個(gè)多個(gè)事務(wù)的并行調(diào)度是正確的,且僅當(dāng)其結(jié)果與按某一次序串行調(diào)度時(shí)的結(jié)果等價(jià)相同,則稱這種調(diào)度策略為事務(wù)的可串行化(Serializable)調(diào)度??纱谢遣l(fā)事務(wù)正確性的判別準(zhǔn)則,一個(gè)給定的并發(fā)調(diào)度,當(dāng)且僅當(dāng)它是可串行化時(shí),才認(rèn)為是正確的調(diào)度。注意:并行調(diào)度中,一個(gè)事務(wù)的執(zhí)行可能會(huì)受到其它事務(wù)的干擾,調(diào)12.3鎖鎖是防止其他事務(wù)訪問(wèn)指定的資源、實(shí)現(xiàn)并發(fā)控制的一種主要手段,有利于確保多用戶環(huán)境下的數(shù)據(jù)一致性。一個(gè)事務(wù)在對(duì)某個(gè)數(shù)據(jù)庫(kù)對(duì)象(如表、記錄等)操作之前,先向系統(tǒng)發(fā)出請(qǐng)求,封鎖該對(duì)象,阻止其它事務(wù)更新此數(shù)據(jù)庫(kù)對(duì)象,從而保證事務(wù)完整性和一致性。12.3.1鎖的模式12.3鎖鎖是防止其他事務(wù)訪問(wèn)指定的資源、實(shí)現(xiàn)并發(fā)控制的12.3.1鎖的模式一個(gè)事務(wù)對(duì)資源對(duì)象加什么樣的鎖是由事物所執(zhí)行任務(wù)來(lái)靈活決定的。SQLServer2005支持的鎖模式有22種,常見(jiàn)的鎖模式如表12-10所示。12.3.1鎖的模式一個(gè)事務(wù)對(duì)資源對(duì)象加什么樣的鎖是由事12.3.1鎖的模式縮寫 描述s 允許其他用戶讀取但不能修改被鎖定資源x 防止別的進(jìn)程修改或者讀取被鎖定資源的數(shù)據(jù)(除非該進(jìn)程設(shè)定為未提交讀隔離級(jí)別)u 防止其他進(jìn)程獲取更新鎖或者排他鎖;在搜索數(shù)據(jù)并修改時(shí)使用is 表示該資源的一個(gè)組件被一個(gè)共享鎖鎖定住了。這類鎖只能在表級(jí)或者分頁(yè)級(jí)才能被獲取iu 表示該資源的一個(gè)組件被一個(gè)更新鎖鎖定住了。這類鎖只能在表級(jí)或者分頁(yè)級(jí)才能被獲取ix 表示該資源的一個(gè)組件被一個(gè)排他鎖鎖定住了。這類鎖只能在表級(jí)或者分頁(yè)級(jí)才能被獲取six 表示一個(gè)正持有共享鎖的資源還有一個(gè)組件(一個(gè)分頁(yè)或者一行記錄)被一個(gè)排他鎖鎖定住siu 表示一個(gè)正持有共享鎖的資源還有一個(gè)組件(一個(gè)分頁(yè)或者一行記錄)被一個(gè)更新鎖鎖定住uix 表示一個(gè)正持有更新鎖的資源還有一個(gè)組件(一個(gè)分頁(yè)或者一行記錄)被一個(gè)排他鎖鎖定住sch-s 表示一個(gè)使用該表的查詢正在被編譯sch-m 表示表的結(jié)構(gòu)正在被修改bu 表示向表進(jìn)行批量數(shù)據(jù)復(fù)制并指定了tablock鎖定提示時(shí)使用(手動(dòng)或自動(dòng)皆可)表12-10SQLServer2005支持的鎖模式12.3.1鎖的模式縮寫 描述表12-10SQLS12.3.1鎖的模式根據(jù)鎖定資源方式的不同,SQLServer2005的鎖分為兩種類型:基本鎖和專用鎖。1.基本鎖基本鎖有兩種:共享鎖(ShareLocks)和排他鎖(ExclusiveLocks)。(1)共享鎖:又稱為S鎖或讀鎖,發(fā)生在查詢數(shù)據(jù)時(shí)。如果事務(wù)T對(duì)數(shù)據(jù)對(duì)象R加上了S鎖,則T只可以讀取R,不可以修改R,同時(shí)允許其他事務(wù)繼續(xù)加S鎖,與T并行讀取R,但不能修改R,直到T釋放R上的S鎖。換句話說(shuō),共享鎖是非獨(dú)占的,允許其他事物共享鎖定,防止其他事物排他鎖定。用戶讀取數(shù)據(jù)之后,立即釋放共享鎖。12.3.1鎖的模式根據(jù)鎖定資源方式的不同,SQLSe12.3.1鎖的模式注意:一般來(lái)說(shuō),共享鎖的鎖定時(shí)間與事務(wù)的隔離級(jí)別有關(guān),如果隔離級(jí)別為ReadCommitted級(jí)別,只在讀?。╯elect)的期間保持鎖定,查詢出數(shù)據(jù)后立即釋放鎖;如果隔離級(jí)別為Repeatableread或Serializable級(jí)別,直到事務(wù)結(jié)束才釋放鎖。另外,如果select語(yǔ)句中指定了HoldLock提示,則也要等到事務(wù)結(jié)束才釋放鎖。(2)排他鎖:又稱為X鎖或?qū)戞i,發(fā)生在增加、刪除和更新數(shù)據(jù)時(shí)。如果事務(wù)T對(duì)數(shù)據(jù)對(duì)象R加上了X鎖,則只允許T讀寫R,其他事務(wù)都不能再對(duì)R加任何鎖,直到T釋放R上的X鎖。換句話說(shuō),排他鎖是獨(dú)占的,與其它事務(wù)的共享鎖或排他鎖都不兼容。用戶更改數(shù)據(jù)總是通過(guò)排他鎖來(lái)鎖定并持續(xù)到事務(wù)結(jié)束后。12.3.1鎖的模式注意:一般來(lái)說(shuō),共享鎖的鎖定時(shí)間與事12.3.1鎖的模式2.專用鎖專用鎖主要有更新鎖、意向鎖、結(jié)構(gòu)鎖和批量更新鎖。(1)更新鎖:又稱為U鎖,是一種介于共享鎖和排他鎖之間的中繼鎖。如果兩個(gè)以上事物同時(shí)將共享鎖升級(jí)為排他鎖時(shí),必然出現(xiàn)彼此等待對(duì)方釋放共享鎖,從而造成死鎖。在修改數(shù)據(jù)事務(wù)開(kāi)始時(shí),如果直接申請(qǐng)更新鎖,鎖定可能要被修改的資源,就可以避免潛在的死鎖。一次只有一個(gè)事務(wù)可以獲得更新鎖,若修改數(shù)據(jù),則轉(zhuǎn)換為排他鎖,否則轉(zhuǎn)換為共享鎖。(2)意向鎖:表示SQLServer有在資源的低層獲得共享鎖或排他鎖的意向。例如放置在表上的共享意向鎖,表示事務(wù)打算在表中的頁(yè)或行上加共享鎖。意向鎖可以提高性能,因?yàn)橄到y(tǒng)僅在表級(jí)上檢查意向鎖而無(wú)須檢查下層。意向鎖又分為:意向共享(IS)鎖、意向排他(IX)鎖和意向排他共享(SIX鎖)。 意向共享鎖:說(shuō)明事務(wù)意圖在它的低層資源上放置共享鎖來(lái)讀取數(shù)據(jù)。 意向排他鎖:說(shuō)明事務(wù)意圖在它的低層資源上放置獨(dú)占鎖來(lái)修改數(shù)據(jù)。 意向排他共享鎖:說(shuō)明事務(wù)意圖在它的頂層資源放置共享鎖來(lái)讀取數(shù)據(jù),并意圖在它的低層資源上放置排他鎖,也稱共享式獨(dú)占鎖。12.3.1鎖的模式2.專用鎖12.3.1鎖的模式(3)結(jié)構(gòu)鎖:用于保證有些進(jìn)程需要結(jié)構(gòu)保持一致時(shí)不會(huì)發(fā)生結(jié)構(gòu)修改。結(jié)構(gòu)鎖分為架構(gòu)修改鎖(Sch-M)和架構(gòu)穩(wěn)定鎖(Sch-S)。執(zhí)行表(結(jié)構(gòu))定義語(yǔ)言操作時(shí),SQLServer采用Sch-M鎖;編譯查詢時(shí),SQLServer采用Sch-S鎖,Sch-S鎖不阻塞任何事物鎖。(4)批量更新鎖:批量復(fù)制數(shù)據(jù)并指定了tablock鎖定提示時(shí)使用批量更新鎖。12.3.1鎖的模式(3)結(jié)構(gòu)鎖:用于保證有些進(jìn)程需要結(jié)12.3.2封鎖協(xié)議1.一級(jí)封鎖協(xié)議事務(wù)T在更新數(shù)據(jù)對(duì)象之前,必須對(duì)其獲準(zhǔn)加X(jué)鎖,并且直到事務(wù)T結(jié)束時(shí)才釋放該鎖。如果未獲準(zhǔn)加X(jué)鎖,則該事務(wù)T進(jìn)入等待狀態(tài),直到獲準(zhǔn)加X(jué)鎖后該事務(wù)才繼續(xù)執(zhí)行。一級(jí)協(xié)議可以防止丟失修改,并保證事務(wù)T是可恢復(fù)的。在1級(jí)封鎖協(xié)議中,如果是讀數(shù)據(jù),不需要加鎖的,所以它不能保證可重復(fù)讀和不讀“臟”數(shù)據(jù)。如表12-11所示。12.3.2封鎖協(xié)議運(yùn)用X鎖和S鎖對(duì)數(shù)據(jù)對(duì)象加鎖時(shí)遵循的規(guī)則(何時(shí)申請(qǐng)X鎖或S鎖,持鎖時(shí)間和何時(shí)釋放),稱為封鎖協(xié)議(LockingProtocol)。封鎖協(xié)議共分為三級(jí),三級(jí)封鎖協(xié)議分別在不同程度上解決了數(shù)據(jù)的不一致性問(wèn)題,為并發(fā)操作的正確調(diào)度提供了一定保證,其中第三級(jí)封鎖協(xié)議是最高級(jí)別。12.3.2封鎖協(xié)議1.一級(jí)封鎖協(xié)議12.3.2封鎖12.3.2封鎖協(xié)議12.3.2封鎖協(xié)議12.3.2封鎖協(xié)議2.二級(jí)封鎖協(xié)議二級(jí)封鎖協(xié)議在一級(jí)封鎖協(xié)議的基礎(chǔ)上,加上事務(wù)T在讀取數(shù)據(jù)對(duì)象R以前必須先對(duì)其加S鎖,讀完數(shù)據(jù)對(duì)象R后即可釋放S鎖。如果未獲準(zhǔn)加S鎖,則該事務(wù)T進(jìn)入等待狀態(tài),直到獲準(zhǔn)加X(jué)鎖后該事務(wù)才繼續(xù)執(zhí)行。二級(jí)封鎖協(xié)議除了能防止丟失修改的問(wèn)題之外,還能解決讀“臟”數(shù)據(jù)的問(wèn)題。如表12-12所示。在2級(jí)封鎖協(xié)議中,由于讀完數(shù)據(jù)后即可釋放S鎖,所以它不能保證可重復(fù)讀。12.3.2封鎖協(xié)議2.二級(jí)封鎖協(xié)議12.3.2封鎖協(xié)議表12-12二級(jí)封鎖協(xié)議與解決讀“臟”數(shù)據(jù)12.3.2封鎖協(xié)議表12-12二級(jí)封鎖協(xié)議與解決讀12.3.2封鎖協(xié)議3.三級(jí)封鎖協(xié)議三級(jí)封鎖協(xié)議在二級(jí)封鎖協(xié)議的基礎(chǔ)上,再規(guī)定S鎖必須在事務(wù)T結(jié)束后才能釋放。如果未獲準(zhǔn)加S鎖,則該事務(wù)T進(jìn)入等待狀態(tài),直到獲準(zhǔn)加X(jué)鎖后該事務(wù)才繼續(xù)執(zhí)行。三級(jí)封鎖協(xié)議除了能防止丟失修改和讀“臟”數(shù)據(jù)的問(wèn)題之外,還能解決不可重復(fù)讀的問(wèn)題。如表12-13所示。12.3.2封鎖協(xié)議3.三級(jí)封鎖協(xié)議12.3.2封鎖協(xié)議12.3.2封鎖協(xié)議12.3.3兩段鎖協(xié)議為了保證并發(fā)調(diào)度的正確性,DBMS普遍采用兩段鎖協(xié)議來(lái)實(shí)現(xiàn)并發(fā)調(diào)度的可串行化。所謂兩段鎖協(xié)議是指將每個(gè)事務(wù)的執(zhí)行嚴(yán)格分為兩個(gè)階段:加鎖階段(擴(kuò)展階段)和解鎖階段(收縮階段)。遵守第三級(jí)封鎖協(xié)議必然遵守兩段鎖協(xié)議。加鎖階段:在對(duì)任何數(shù)據(jù)進(jìn)行讀操作之前要申請(qǐng)并獲得S鎖,在進(jìn)行寫操作之前要申請(qǐng)并獲得X鎖。在這階段,事務(wù)可以申請(qǐng)加鎖,但不能釋放鎖。解鎖階段:當(dāng)事務(wù)釋放了一個(gè)鎖以后,事務(wù)進(jìn)入解鎖階段,在這階段,事務(wù)只能解鎖,不能再進(jìn)行加鎖。兩段鎖協(xié)議是從加鎖、解鎖順序(會(huì)影響事務(wù)的并發(fā)調(diào)度)的角度來(lái)描述。若并發(fā)執(zhí)行的事物均遵守兩段鎖協(xié)議,則對(duì)這些事物的任何并發(fā)調(diào)度策略都是可串行化的。兩段鎖協(xié)議是并發(fā)調(diào)度可串行化的充分條件,但不是必要條件。在實(shí)際應(yīng)用中也有一些事物并不遵守兩段鎖協(xié)議,但它們卻可能是可串行化調(diào)度。例如,表12-14和表12-15都是可串行化調(diào)度,不過(guò)只有表12-14遵守兩段協(xié)議,而表12-15不遵守兩段協(xié)議注意:一次封鎖法要求每個(gè)事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,否則就不能繼續(xù)執(zhí)行,因此一次封鎖法遵守兩段鎖協(xié)議;但是兩段鎖協(xié)議并不要求事務(wù)必須一次將所有要使用的數(shù)據(jù)全部加鎖,因此遵守兩段鎖協(xié)議的事務(wù)可能發(fā)生死鎖。12.3.3兩段鎖協(xié)議為了保證并發(fā)調(diào)度的正確性,DBMS12.3.3兩段鎖協(xié)議12.3.3兩段鎖協(xié)議12.3.4鎖的粒度加鎖對(duì)并發(fā)訪問(wèn)的影響體現(xiàn)在鎖的粒度上,鎖的粒度是指鎖的生效范圍(封鎖對(duì)象)。SQLServer系統(tǒng)具有多粒度鎖定,允許鎖定不同層次的資源。為了使鎖定成本減至最少,系統(tǒng)自動(dòng)分析SQL語(yǔ)句請(qǐng)求,將資源鎖定在適合任務(wù)的級(jí)別上,在鎖的數(shù)目太多時(shí),也會(huì)自動(dòng)進(jìn)行鎖升級(jí)。如更新某一行,用行級(jí)鎖;而更新所有行,則升級(jí)為表級(jí)鎖。根據(jù)封鎖的資源不同,鎖分為行、頁(yè)、范圍、表或數(shù)據(jù)庫(kù)級(jí)鎖,如表12-16所示。12.3.4鎖的粒度12.3.4鎖的粒度12.3.4鎖的粒度12.3.4鎖的粒度封鎖粒度與系統(tǒng)的并發(fā)度和并發(fā)控制的開(kāi)銷密切相關(guān)。直觀地看,封鎖的粒度越大,數(shù)據(jù)庫(kù)所能夠封鎖的數(shù)據(jù)單元就越少,并發(fā)度就越小,系統(tǒng)開(kāi)銷也越??;反之,封鎖的粒度越小,并發(fā)度較高,但系統(tǒng)開(kāi)銷也就越大。注意:(1)行級(jí)鎖是一種最優(yōu)鎖,因?yàn)樾屑?jí)鎖不可能出現(xiàn)占用數(shù)據(jù)而不使用數(shù)據(jù)的現(xiàn)象。(2)鎖升級(jí)是指調(diào)整鎖的粒度,將多個(gè)低粒度的鎖替換成少數(shù)的更高粒度的鎖。12.3.4鎖的粒度封鎖粒度與系統(tǒng)的并發(fā)度和并發(fā)控制的開(kāi)在SQLServer2005中,查看鎖的信息有多種方式,既可以通過(guò)SSMS查看鎖信息,也可以通過(guò)存儲(chǔ)過(guò)程查看信息。另外,通過(guò)SQLProfiler工具,還可以圖形化的方式顯示與分析死鎖(Deadlock)事件,有關(guān)操作請(qǐng)參閱相關(guān)資料。1.鎖的兼容性在一個(gè)事務(wù)已經(jīng)鎖定某個(gè)對(duì)象的情況下,另一個(gè)事務(wù)也請(qǐng)求鎖定該對(duì)象,則會(huì)出現(xiàn)鎖定兼容與沖突。當(dāng)兩種鎖定方式兼容時(shí),允許第二個(gè)事物的鎖定請(qǐng)求。反之,不允許第二個(gè)事物的鎖定請(qǐng)求,直至等待第一個(gè)事務(wù)釋放其現(xiàn)有的不兼容鎖定為止。資源鎖模式有一個(gè)兼容性矩陣,列出同一資源上可獲取的兼容性的鎖,如表12-17所示。12.3.5查看鎖的信息12.3.5查看鎖的信息12.3.5查看鎖的信息12.3.5查看鎖的信息12.3.5查看鎖的信息注意:(1)意向排他(IX)鎖與意向排他(IX)鎖模式兼容,因?yàn)镮X鎖只打算更新一些行而不是所有行,還允許其它事務(wù)讀取或更新部分行,只要這些行不是當(dāng)前事務(wù)所更新的行即可。(2)架構(gòu)穩(wěn)定性(Sch-S)鎖與除了架構(gòu)修改(Sch-M)鎖模式之外的所有鎖模式相兼容。(3)架構(gòu)修改(Sch-M)鎖與所有鎖模式都不兼容。(4)批量更新(BU)鎖只與架構(gòu)穩(wěn)定(Sch-S)鎖及其它BU鎖相兼容。12.3.5查看鎖的信息注意:12.3.5查看鎖的信息【例12-4】共享鎖和更新鎖兼容示例。A事物:begintranselect時(shí)間1=getdate(),*from學(xué)生with(updlock)where學(xué)號(hào)='08010101'gowaitfordelay'00:00:06' --暫停6秒update學(xué)生set總分=總分-10where學(xué)號(hào)='08010101' updlock升級(jí)為排他鎖waitfordelay'00:00:06'rollbacktrangoselect時(shí)間2=getdate(),*from學(xué)生where學(xué)號(hào)='08010101'B事物:begintranselect時(shí)間1=getdate(),*from學(xué)生with(updlock)where學(xué)號(hào)='08010101'gowaitfordelay'00:00:06'update學(xué)生set總分=總分+10where學(xué)號(hào)='08010101'select時(shí)間2=getdate(),*from學(xué)生where學(xué)號(hào)='08010101'committran先執(zhí)行A事務(wù),然后立即執(zhí)行B事務(wù),A、B事物最終運(yùn)行結(jié)果如圖12-1和圖12-2所示。注意:共享鎖和更新鎖可以同時(shí)在同一個(gè)資源上。同一時(shí)間不能在同一資源上有兩個(gè)更新鎖。一個(gè)事物只能有一個(gè)更新鎖獲此資格。12.3.5查看鎖的信息【例12-4】共享鎖和更新鎖兼12.3.5查看鎖的信息2.通過(guò)SSMS查看鎖的信息(1)啟動(dòng)SSMS,在“對(duì)象資源管理器”窗格中依次展開(kāi)SHUJU(服務(wù)器實(shí)例)→“管理”,右擊“活動(dòng)監(jiān)視器”,彈出快捷菜單,選擇“查看進(jìn)程”命令,如圖12-1所示。(2)單擊釋放后,打開(kāi)“活動(dòng)監(jiān)視器”對(duì)話框的“進(jìn)程狀態(tài)”界面,如圖12-2所示。

圖12-4“活動(dòng)監(jiān)視器”對(duì)話框的“進(jìn)程狀態(tài)”界面(3)單擊“按進(jìn)程分類的鎖”或“按對(duì)象分類的鎖”選項(xiàng)卡,可以看到鎖的具體信息。12.3.5查看鎖的信息2.通過(guò)SSMS查看鎖的信息12.3.5查看鎖的信息3.使用存儲(chǔ)過(guò)程查看鎖的信息使用系統(tǒng)存儲(chǔ)過(guò)程sp_lock也可以列出當(dāng)前的鎖,其語(yǔ)法格式如下:格式:sp_lock[spid]說(shuō)明:spid是int類型的進(jìn)程ID號(hào),如果不指定spid,則顯示所有進(jìn)程的鎖?!纠?2-5】顯示編號(hào)為53的鎖的信息。usejxglexecsp_lock5312.3.5查看鎖的信息3.使用存儲(chǔ)過(guò)程查看鎖的信息13.3.6鎖定提示封鎖及其升級(jí)是由系統(tǒng)動(dòng)態(tài)管理的,然而,有時(shí)為了應(yīng)用程序正確運(yùn)行和保持?jǐn)?shù)據(jù)的一致性,必須人為地對(duì)SQL語(yǔ)句進(jìn)行特別指定(鎖定提示,手工加鎖),其語(yǔ)法格式如下:格式:select*from<表名>whith(鎖)where<條件>說(shuō)明:鎖定提示優(yōu)先于事務(wù)隔離級(jí)別,常見(jiàn)的鎖定提示有三種類型:(1)類型1①ReadunCommitted:不發(fā)出鎖。②ReadCommitted:發(fā)出共享鎖,保持到讀取結(jié)束。③Repeatableread:發(fā)出共享鎖,保持到事務(wù)結(jié)束。④Serializable:發(fā)出共享鎖,保持到事務(wù)結(jié)束。13.3.6鎖定提示封鎖及其升級(jí)是由系統(tǒng)動(dòng)態(tài)管理的,然而13.3.6鎖定提示(2)類型2①Nolock:不發(fā)出鎖,可讀到“臟”數(shù)據(jù),這個(gè)選項(xiàng)僅僅應(yīng)用于select語(yǔ)句。②Holdlock:發(fā)出共享鎖,持續(xù)到事務(wù)結(jié)束釋放,等同于Serializable在表級(jí)上的應(yīng)用。③Xlock:發(fā)出排他鎖,持續(xù)到事務(wù)結(jié)束釋放(排他鎖與共享鎖不兼容)。④Updlock:發(fā)出更新鎖,持續(xù)到這個(gè)語(yǔ)句或整個(gè)事務(wù)結(jié)束釋放,允許別的事物讀數(shù)據(jù)(更新鎖與共享鎖兼容),不允許更新和刪除。⑤Readpast:發(fā)出共享鎖,但跳過(guò)鎖定行,它不會(huì)被阻塞。適用條件:提交讀的隔離級(jí)別,行級(jí)鎖,Select語(yǔ)句中。(3)類型3①Rowlock:使用行級(jí)鎖,而不使用粒度更粗的頁(yè)級(jí)鎖和表級(jí)鎖。②Paglock:在使用一個(gè)表鎖的地方使用多個(gè)頁(yè)鎖。③Tablock:在表級(jí)上發(fā)出共享鎖,持續(xù)到語(yǔ)句結(jié)束釋放。xlocktablock等價(jià)于Tablockx。④Tablockx:在表級(jí)上發(fā)出排他鎖,持續(xù)到語(yǔ)句或事務(wù)結(jié)束,阻止其他事務(wù)讀或更新數(shù)據(jù)。13.3.6鎖定提示(2)類型213.3.6鎖定提示【例12-6】系統(tǒng)自動(dòng)加排他鎖的情況。A事物:begintranupdate學(xué)生set姓名='席同鎖'where學(xué)號(hào)='08010101'waitfordelay'00:00:10' --等待10秒committranB事物:begintranselect*from學(xué)生where學(xué)號(hào)='08010101' --等待A事物結(jié)束才能執(zhí)行committran執(zhí)行A事物后,立即執(zhí)行B事物,則B事物(select語(yǔ)句)必須等待A事物(執(zhí)行update語(yǔ)句時(shí),系統(tǒng)自動(dòng)加排他鎖)執(zhí)行完畢才能執(zhí)行,即B事物要等待10秒才能顯示查詢結(jié)果?!纠?2-7】人為加holdlock鎖的情況(比較tablock鎖)。A事物:begintranselect時(shí)間0=getdate(),*from學(xué)生with(holdlock) --人為加holdlock鎖

where學(xué)號(hào)='08010101'gowaitfordelay'00:00:10' --延遲10秒后結(jié)束事物committranB事物:begintranselect時(shí)間1=getdate(),*from學(xué)生where學(xué)號(hào)='08010101'--不等待,立即執(zhí)行

goupdate學(xué)生set姓名='任偉鎖'where學(xué)號(hào)='08010101' --伴隨A事物延遲

goselect時(shí)間2=getdate(),*from學(xué)生where學(xué)號(hào)='08010101'committran執(zhí)行A事物后,立即執(zhí)行B事物,A、B事物最終運(yùn)行結(jié)果如圖12-5和12-6所示。13.3.6鎖定提示【例12-6】系統(tǒng)自動(dòng)加排他鎖的情13.3.6鎖定提示注意:B事物連接中的select語(yǔ)句可以立即執(zhí)行,而update語(yǔ)句必須等待A事物連接中的共享鎖結(jié)束后才能執(zhí)行,即B事物連接中的update語(yǔ)句要等待10秒才能執(zhí)行?!纠?2-8】人為加tablock鎖的情況(比較holdlock鎖)。A事物:begintranselect時(shí)間0=getdate(),*from學(xué)生with(tablock) --人為加tablock鎖

where學(xué)號(hào)='08010101gowaitfordelay'00:00:10' --延遲10秒后結(jié)束事物committranB事物:begintranselect時(shí)間1=getdate(),*from學(xué)生where學(xué)號(hào)='08010101'--不等待,立即執(zhí)行

goupdate學(xué)生set姓名='龔巷鎖'where學(xué)號(hào)='08010101' --不等待,立即執(zhí)行

goselect時(shí)間2=getdate(),*from學(xué)生where學(xué)號(hào)='08010101'committran執(zhí)行A事物后,立即執(zhí)行B事物,A、B事物最終運(yùn)行結(jié)果如圖12-7和12-8所示。13.3.6鎖定提示注意:B事物連接中的select語(yǔ)句12.3.7活鎖與死鎖封鎖可有效解決并行操作的不一致性問(wèn)題,但也因此而產(chǎn)生新的問(wèn)題:活鎖和死鎖。1.活鎖(Livelock)當(dāng)某個(gè)事務(wù)請(qǐng)求對(duì)某一數(shù)據(jù)的排他性封鎖時(shí),由于其他事務(wù)對(duì)該數(shù)據(jù)的操作而使這個(gè)事務(wù)處于永久等待狀態(tài),這種狀態(tài)稱為活鎖?!纠?2-9】如果事務(wù)T1封鎖了數(shù)據(jù)R,事務(wù)T2又請(qǐng)求封鎖R,于是T2等待。T3也請(qǐng)求封鎖R,當(dāng)T1釋放了R上的封鎖之后系統(tǒng)首先批準(zhǔn)了T3的請(qǐng)求,T2仍然等待。然后T4又請(qǐng)求封鎖R,當(dāng)T3釋放了R上的封鎖之后系統(tǒng)又批準(zhǔn)了T4的請(qǐng)求,……,T2有可能永遠(yuǎn)等待,從而發(fā)生了活鎖。如表12-18所示。12.3.7活鎖與死鎖封鎖可有效解決并行操作的不一致性問(wèn)12.3.7活鎖與死鎖12.3.7活鎖與死鎖12.3.7活鎖與死鎖預(yù)防活鎖的簡(jiǎn)單辦法是采用“先來(lái)先服務(wù)”的策略。當(dāng)多個(gè)事務(wù)請(qǐng)求封鎖同一數(shù)據(jù)對(duì)象時(shí),封鎖子系統(tǒng)按請(qǐng)求封鎖的先后次序?qū)κ挛锱抨?duì),數(shù)據(jù)對(duì)象上的鎖一旦釋放,就按順序批準(zhǔn)申請(qǐng)隊(duì)列中的第一個(gè)事務(wù)獲得鎖。12.3.7活鎖與死鎖預(yù)防活鎖的簡(jiǎn)單辦法是采用“先來(lái)先服12.3.7活鎖與死鎖2.死鎖(Deadlock)在數(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)。死鎖是所有事務(wù)都被無(wú)限長(zhǎng)延遲的極端阻塞情況,導(dǎo)致死鎖出現(xiàn)的情況主要有兩種:(1)兩個(gè)事務(wù)同時(shí)鎖定兩個(gè)單獨(dú)的對(duì)象,又彼此要求封鎖對(duì)方的鎖定對(duì)象。(2)長(zhǎng)時(shí)間執(zhí)行不能控制處理順序的并發(fā)事物,比如復(fù)雜查詢中連接查詢。12.3.7活鎖與死鎖2.死鎖(Deadlock)12.3.7活鎖與死鎖【例12-10】如果事務(wù)T1封鎖了數(shù)據(jù)R1,T2封鎖了數(shù)據(jù)R2,然后T1又請(qǐng)求封鎖R2,因T2已封鎖了R2,于是T1等待T2釋放R2上的鎖。接著T2又申請(qǐng)封鎖R1,因T1已封鎖了R1,T2也只能等待T1釋放R1上的鎖。這樣就出現(xiàn)了相互等待狀態(tài)而不能結(jié)束,就形成了死鎖的局面。如表12-19所示。12.3.7活鎖與死鎖【例12-10】如果事務(wù)T1封鎖12.3.7活鎖與死鎖12.3.7活鎖與死鎖12.3.7活鎖與死鎖防止死鎖的發(fā)生其實(shí)就是要破壞產(chǎn)生死鎖的條件。預(yù)防死鎖通常有兩種方法:(1)一次加鎖法要求每個(gè)事務(wù)一次就將要使用的數(shù)據(jù)全部加鎖,否則就不能繼續(xù)執(zhí)行下去。其存在以下缺點(diǎn): 事務(wù)耗時(shí)鎖定過(guò)多數(shù)據(jù),延遲其他事務(wù)及時(shí)訪問(wèn),降低了系統(tǒng)的并發(fā)程度;

無(wú)法預(yù)知事務(wù)需要加鎖的數(shù)據(jù),被迫擴(kuò)大加鎖范圍,降低了系統(tǒng)的并發(fā)程度;(2)順序加鎖法預(yù)先規(guī)定一個(gè)訪問(wèn)數(shù)據(jù)的加鎖順序,要求所有事務(wù)都遵照?qǐng)?zhí)行這個(gè)加鎖順序。其存在以下缺點(diǎn): 需要加鎖的數(shù)據(jù)過(guò)多,并且不斷變化,維護(hù)加鎖順序很困難,代價(jià)非常大; 事物封鎖請(qǐng)求是隨著事物執(zhí)行而動(dòng)態(tài)決定,無(wú)法預(yù)知事務(wù)訪問(wèn)的數(shù)據(jù),難以統(tǒng)一要求事務(wù)遵照固定的加鎖順序;在操作系統(tǒng)中廣為使用的預(yù)防死鎖發(fā)生的策略并不適合數(shù)據(jù)庫(kù)系統(tǒng)的特點(diǎn)。在DBMS中普遍采用的是診斷并解除死鎖的辦法,即允許發(fā)生死鎖,采用一定手段定期診斷系統(tǒng)中有無(wú)死鎖,如有就設(shè)法解除之。診斷死鎖并解除死鎖的方法有超時(shí)法和事物等待圖法。(1)超時(shí)法:如果一個(gè)事務(wù)的等待時(shí)間超過(guò)規(guī)定時(shí)間,就認(rèn)為發(fā)生了死鎖。這個(gè)實(shí)現(xiàn)簡(jiǎn)單,但不足也很明顯。一是誤判死鎖,事物因?yàn)槠渌蚴沟却龝r(shí)間超過(guò)時(shí)限被誤判為死鎖;二是時(shí)限設(shè)置太長(zhǎng),死鎖發(fā)生后不可能及時(shí)發(fā)現(xiàn)。(2)事務(wù)等待圖法:事務(wù)等待圖是一個(gè)有向圖G=(T,U),T為結(jié)點(diǎn)的集合,每個(gè)結(jié)點(diǎn)表示正在運(yùn)行的事務(wù);U為邊的集合,每條邊表示事務(wù)等待的情況。若事務(wù)T1等待事務(wù)T2,則T1,T2之間劃一條有向邊,表示從T1指向T2。事物等待圖動(dòng)態(tài)地反映了所有事物的等待情況。并發(fā)控制子系統(tǒng)周期性地生成事物等待圖,并進(jìn)行檢測(cè)。如果發(fā)現(xiàn)圖中存在回路,則表示系統(tǒng)中出現(xiàn)了死鎖。當(dāng)搜索檢測(cè)到鎖定請(qǐng)求環(huán)時(shí),SQLServer系統(tǒng)通常選擇一個(gè)處理死鎖代價(jià)最小的事物,將其撤銷,釋放此事物持有的所有鎖,使其他事物得以繼續(xù)下去。當(dāng)然,系統(tǒng)回滾該事務(wù)以保持?jǐn)?shù)據(jù)一致性,并向該進(jìn)程發(fā)出1205號(hào)錯(cuò)誤信息。12.3.7活鎖與死鎖防止死鎖的發(fā)生其實(shí)就是要破壞產(chǎn)生死12.3.7活鎖與死鎖【例12-11】死鎖示例。A事物:begintranselect時(shí)間1=getdate(),*from學(xué)生with(holdlock)where學(xué)號(hào)='08010101'gowaitfordelay'00:00:06'update學(xué)生set總分=總分-10where學(xué)號(hào)='08010101'waitfordelay'00:00:06'rollbacktrangoselect時(shí)間2=getdate(),*from學(xué)生where學(xué)號(hào)='08010101'B事物:begintranselect時(shí)間1=getdate(),*from學(xué)生with(holdlock)where學(xué)號(hào)='08010101'gowaitfordelay'00:00:06'update學(xué)生set總分=總分-10where學(xué)號(hào)='08010101'select時(shí)間2=getdate(),*from學(xué)生where學(xué)號(hào)='08010101'committran執(zhí)行A事務(wù)后,立即執(zhí)行B事務(wù),A、B事務(wù)最終運(yùn)行結(jié)果如圖12-9和圖12-10所示。12.3.7活鎖與死鎖【例12-11】死鎖示例。12.3.7活鎖與死鎖注意:當(dāng)T1執(zhí)行select語(yǔ)句后,其共享鎖需升級(jí)為排他鎖才能繼續(xù)執(zhí)行update語(yǔ)句,升級(jí)之前,需要T2釋放其共享鎖,但共享鎖holdlock只有在事務(wù)結(jié)束后才釋放,所以T2不釋放共享鎖而導(dǎo)致T1等待。同理,T1不釋放共享鎖而導(dǎo)致T2等待,這樣就產(chǎn)生了死鎖。12.3.7活鎖與死鎖注意:當(dāng)T1執(zhí)行select語(yǔ)句后12.4事務(wù)隔離級(jí)別很多情況下,定義正確的隔離級(jí)別并不是簡(jiǎn)單的決定。作為一種通用的規(guī)則,使用較低的隔離級(jí)別(已提交讀)比使用較高的隔離級(jí)別(可序列化)持有共享鎖的時(shí)間更短,更有利于減少鎖競(jìng)爭(zhēng),避免死鎖,同時(shí)依然可以為事務(wù)提供它所需的并發(fā)性能。12.4.1隔離級(jí)別概述12.4事務(wù)隔離級(jí)別很多情況下,定義正確的隔離級(jí)別并不是12.4.1隔離級(jí)別概述事務(wù)隔離級(jí)別是控制一個(gè)事物與其它事物隔離程度,它是系統(tǒng)內(nèi)置的一組加鎖策略。對(duì)于編程人員來(lái)說(shuō),不是通過(guò)手工設(shè)置來(lái)控制鎖的使用,而是通過(guò)設(shè)置事務(wù)的隔離級(jí)別來(lái)控制鎖的使用,從而實(shí)現(xiàn)并發(fā)法訪問(wèn)控制。1.并發(fā)控制模型為避免并發(fā)訪問(wèn)可能產(chǎn)生的不利影響,SQLServer2005提供了兩種并發(fā)控制機(jī)制:悲觀并發(fā)控制模式和樂(lè)觀并發(fā)控制模式。(1)悲觀并發(fā)控制模式假定系統(tǒng)中存在足夠多的數(shù)據(jù)修改操作,以致于任何確定的讀操作都可能受到其他用戶寫操作的影響。在事務(wù)執(zhí)行過(guò)程中,悲觀并發(fā)控制將根據(jù)需要使用鎖鎖定資源。在悲觀并發(fā)環(huán)境中,讀(reader)和寫(writer)之間是沖突的、互相阻塞的。(2)樂(lè)觀并發(fā)控制模式假定系統(tǒng)中存在非常少的數(shù)據(jù)修改操作,以致于任何單獨(dú)的事務(wù)都不太可能影響其他事務(wù)正在修改的數(shù)據(jù)。樂(lè)觀并發(fā)控制采用行版本查看事物,或查詢當(dāng)前進(jìn)程一開(kāi)始讀取時(shí)的數(shù)據(jù)狀態(tài),并且不受當(dāng)前進(jìn)程或其它進(jìn)程對(duì)數(shù)據(jù)進(jìn)行修改的影響。在樂(lè)觀并發(fā)環(huán)境中,讀寫之間不會(huì)互相阻塞,但是寫者之間會(huì)發(fā)生阻塞。12.4.1隔離級(jí)別概述事務(wù)隔離級(jí)別是控制一個(gè)事物與其它12.4.1隔離級(jí)別概述注意:(1)樂(lè)觀鎖的缺點(diǎn)是發(fā)生沖突時(shí),SQLServer會(huì)拋出異常給應(yīng)用程序處理,而應(yīng)用程序一般會(huì)要求重新執(zhí)行事務(wù),因而影響系統(tǒng)的性能和增加處理的復(fù)雜性。(2)快照和已提交讀快照的區(qū)別:已提交讀快照只是在更新的時(shí)候?qū)煺蘸驮紨?shù)據(jù)進(jìn)行版本比較;而快照則不僅在更新時(shí)比較,而且在多次讀事務(wù)的時(shí)候也比較讀取數(shù)據(jù)的版本。2.事物隔離級(jí)別設(shè)置事物隔離級(jí)別的命令是settransactionisolationlevel,其語(yǔ)法格式如下:格式:settransactionisolationlevel{readcommitted|readuncommitted|repeatableread|serializable|snapshot}說(shuō)明:系統(tǒng)按照設(shè)置的隔離級(jí)別自動(dòng)控制并發(fā)事物處理;12.4.1隔離級(jí)別概述注意:12.4.2悲觀并發(fā)模型SQLServer2005支持ANSI/ISOSQL92標(biāo)準(zhǔn)定義的4個(gè)等級(jí)的事務(wù)隔離級(jí)別,不同事物隔離級(jí)別能夠解決的數(shù)據(jù)并發(fā)問(wèn)題的能力是不同的,如表12-20所示。隔離級(jí)別越高,越能保證數(shù)據(jù)的完整性和一致性,但也意味著并發(fā)性能的降低。通常情況下,隔離級(jí)別設(shè)為ReadCommitted,既能避免臟讀取,又保持較好的并發(fā)性能。12.4.2悲觀并發(fā)模型SQLServer200512.4.2悲觀并發(fā)模型1.未提交讀未提交讀(ReadUncommitted):這是最低的事務(wù)隔離級(jí)別,僅僅保證讀取過(guò)程中不會(huì)讀取非法數(shù)據(jù),讀事務(wù)不會(huì)阻塞讀事務(wù)和寫事務(wù),因而讀事務(wù)可以讀取寫事務(wù)尚未提交的數(shù)據(jù),寫事務(wù)也不會(huì)阻塞讀事務(wù),只會(huì)阻塞寫事務(wù)而已?!纠?2-12】使用未提交隔離級(jí)別的臟讀示例。A事物:usejxglgosettransactionisolationlevelreaduncommittedbegintranupdate學(xué)生set總分=總分+5where籍貫='山東'select次數(shù)=1,*from學(xué)生where籍貫='山東'waitfordelay'00:00:10' --暫停10秒

rollbacktransaction --回滾事務(wù)

select次數(shù)=2,*from學(xué)生where籍貫='山東'B事物:settransactionisolationlevelreaduncommittedbegintransactionselect*from學(xué)生where籍貫='山東'committransaction執(zhí)行A事務(wù)后,立即運(yùn)行B事務(wù),A、B事務(wù)最終運(yùn)行結(jié)果如圖12-11和圖12-12所示。12.4.2悲觀并發(fā)模型1.未提交讀12.4.2悲觀并發(fā)模型2.已提交讀已提交讀(ReadCommitted):采用此種隔離界別的時(shí)候,讀事務(wù)不會(huì)阻塞讀事務(wù)和寫事務(wù),不過(guò)寫事務(wù)會(huì)阻塞讀事務(wù)和寫事務(wù),因而只解決了臟讀問(wèn)題,沒(méi)有解決不可重復(fù)讀和幻讀問(wèn)題。此選項(xiàng)是SQLServer2005默認(rèn)的隔離級(jí)。【例12-13】使用已提交隔離級(jí)別的不可重復(fù)讀示例。A事物:usejxglgosettranisolationlevelreadcommittedbegintransactionselect次數(shù)=1,*from學(xué)生where籍貫='山東'gowaitfordelay'00:00:10'select次數(shù)=2,*from學(xué)生where籍貫='山東'gowaitfordelay'00:00:10'select次數(shù)=3,*from學(xué)生where籍貫='山東'gocommittransactionB事物:usejxglgosettranisolationlevelreadcommittedbegintransactionupdate學(xué)生set總分=總分-5where籍貫='山東'goselect*from學(xué)生where籍貫='山東'gowaitfordelay'00:00:10'committransaction執(zhí)行A事務(wù)后,立即運(yùn)行B事務(wù),A、B事務(wù)最終運(yùn)行結(jié)果如圖12-13和圖12-14所示。12.4.2悲觀并發(fā)模型2.已提交讀12.4.2悲觀并發(fā)模型3.可重復(fù)讀可重復(fù)讀(RepeatableRead):采用此種隔離級(jí)別,讀事務(wù)只阻塞寫事務(wù)中的update和delete操作,不阻塞讀事務(wù)和寫事物中的insert操作,因而只解決了臟讀和不可重復(fù)讀的問(wèn)題,還是沒(méi)有解決幻讀問(wèn)題。此選項(xiàng)會(huì)影響系統(tǒng)的效能,非必要情況最好不用此隔離級(jí);【例12-14】使用可重復(fù)讀隔離級(jí)別的幻讀示例。A事物:usejxglgosettranisolationlevelrepeatablereadbegintransactionselect*from學(xué)生where籍貫='山東'gowaitfordelay'00:00:10'select*from學(xué)生where籍貫='山東'committransactionwaitfordelay'00:00:10'settranisolationlevelreadcommittedgoB事物:usejxglgosettranisolationlevelrepeatablereadbegintransactioninsertinto學(xué)生(學(xué)號(hào),姓名,性別,總分,籍貫)values('11010101','柯崇福','男',550,'山東')committransaction執(zhí)行A事務(wù)后,立即運(yùn)行B事務(wù),A事務(wù)最終運(yùn)行結(jié)果如圖12-15所示。12.4.2悲觀并發(fā)模型3.可重復(fù)讀12.4.2悲觀并發(fā)模型4.可串行化讀可串行化讀(Serializable):此種隔離級(jí)別是最嚴(yán)格的隔離級(jí)別,和X鎖類似,要求事物序列化執(zhí)行,讀事務(wù)阻塞了寫事務(wù)任何操作,解決了并發(fā)異常問(wèn)題(臟讀、不可重復(fù)讀、幻讀)。此選項(xiàng)極大影響系統(tǒng)的性能,如非必要,應(yīng)該避免設(shè)置此隔離級(jí);【例12-15】使用可串行化讀隔離級(jí)別。A事物:usejxglgosettranisolationlevelserializablebegintransactionselect*from學(xué)生where籍貫='山西'gowaitfordelay'00:00:30'select*from學(xué)生where籍貫='山西'gocommittransactionsettranisolationlevelreadcommittedgoB事物:begintransactioninsertinto學(xué)生(學(xué)號(hào),姓名,性別,總分,籍貫)values('11010104','徐列華','男',550,'山西')select*from學(xué)生where籍貫='山西'goupdate學(xué)生set性別='女'where學(xué)號(hào)='11010104'select*from學(xué)生where籍貫='山西'gocommittransaction執(zhí)行A事務(wù)后,立即運(yùn)行B事務(wù),A、B事務(wù)最終運(yùn)行結(jié)果如圖12-16和圖12-17所示。12.4.2悲觀并發(fā)模型4.可串行化讀12.4.3樂(lè)觀并發(fā)模型行版本控制允許一個(gè)事務(wù)在排他鎖定數(shù)據(jù)后讀取數(shù)據(jù)的最后提交版本,讀取數(shù)據(jù)時(shí)不再請(qǐng)求共享鎖,而且永遠(yuǎn)不會(huì)與修改進(jìn)程的數(shù)據(jù)發(fā)生沖突,如果請(qǐng)求的行被鎖定(如正被更新),SQLServer2005系統(tǒng)會(huì)從行版本存儲(chǔ)區(qū)返回最早的關(guān)于該行的記錄。由于不必等待到鎖釋放就可進(jìn)行讀操作,可以降低讀寫操作之間發(fā)生的死鎖幾率,因此查詢性能得以大大增強(qiáng)。SQLServer2005支持兩種基于行版本的事務(wù)隔離級(jí)別:已提交讀快照和快照。這兩種隔離級(jí)別如表12-21所示。12.4.3樂(lè)觀并發(fā)模型行版本控制允許一個(gè)事務(wù)在排他鎖定12.4.3樂(lè)觀并發(fā)模型1.已提交讀快照已提交讀快照(Read_Committed_Snapshot):它是已提交讀隔離級(jí)別的一種實(shí)現(xiàn)方法。和已提交讀級(jí)別相比較:相同的是兩者只能避免臟讀,也無(wú)更新沖突檢測(cè),不同的是,已提交讀快照讀數(shù)據(jù)時(shí)無(wú)須共享鎖,因而讀寫之間不會(huì)阻塞。12.4.3樂(lè)觀并發(fā)模型1.已提交讀快照12.4.3樂(lè)觀并發(fā)模型【例12-16】使用已提交讀(快照)隔離級(jí)別。A事物:alterdatabasejxglsetallow_snapshot_isolationonusejxglgoalterdatabasejxglsetread_committed_snapshotongosettransactionisolationlevelreadcommittedgobegintransactionselect*from學(xué)生where籍貫='山東'gowaitfordelay'00:00:10'select*from學(xué)生where籍貫='山東'gocommittransactionB事物:usejxglgobegintransactionupdate學(xué)生set總分=總分-5where籍貫='山東'goselect*from學(xué)生where籍貫='山東'gocommittransaction執(zhí)行A事務(wù)后,立即運(yùn)行B事務(wù),A、B事務(wù)最終運(yùn)行結(jié)果如圖12-18和圖12-19所示。12.4.3樂(lè)觀并發(fā)模型【例12-16】使用已提交讀(12.4.3樂(lè)觀并發(fā)模型2.快照快照(Snapshot):所有讀取操作不再受其它鎖定影響,讀取的數(shù)據(jù)是讀取事物開(kāi)始前邏輯確定并符合一致性的數(shù)據(jù)行版本??煺湛梢员苊馀K讀、丟失更新、不可重復(fù)讀、幻讀、而且有更新沖突檢測(cè)的特點(diǎn)。12.4.3樂(lè)觀并發(fā)模型2.快照12.4.3樂(lè)觀并發(fā)模型【例12-17】使用快照隔離級(jí)別。A事物:usejxglgoalterdatabasejxglsetallow_snapshot_isolationongosettranisolationlevelsnapshotbegintransactionselect*from學(xué)生where籍貫='山東'gowaitfordelay'00:00:10'select*from學(xué)生where籍貫='山東'committransactiongoalterdatabasejxglsetallow_snapshot_isolationoffgoB事物:usejxglgobegintransactionupdate學(xué)生set總分=總分+5where籍貫='山東'goselect*from學(xué)生where籍貫='山東'gocommittransactiongo執(zhí)行A事務(wù)后,立即運(yùn)行B事務(wù),A、B事務(wù)最終運(yùn)行結(jié)果如圖12-20和圖12-21所示。12.4.3樂(lè)觀并發(fā)模型【例12-17】使用快照隔離級(jí)本章小結(jié)事務(wù)和鎖是兩個(gè)緊密聯(lián)系的概念。對(duì)于多用戶系統(tǒng)來(lái)說(shuō),事務(wù)使用鎖來(lái)防止其他用戶修改另外一個(gè)還沒(méi)有完成的事務(wù)中的數(shù)據(jù),解決了數(shù)據(jù)庫(kù)的并發(fā)性問(wèn)題。SQLServer2005具有多粒度鎖定,允許一個(gè)事務(wù)鎖定不同類型的資源。為了使鎖定的成本減至最少,SQLServer自動(dòng)將資源對(duì)象鎖定在適合任務(wù)的級(jí)別上。本章小結(jié)事務(wù)和鎖是兩個(gè)緊密聯(lián)系的概念。對(duì)于多用戶系統(tǒng)來(lái)說(shuō),事第12章并發(fā)控制本章導(dǎo)讀:為了避免多用戶并行存取數(shù)據(jù)庫(kù)時(shí),破壞事物的完整性和數(shù)據(jù)的一致性,SQLServer提供了并發(fā)控制機(jī)制。并發(fā)控制機(jī)制主要通過(guò)事務(wù)隔離級(jí)別和封鎖機(jī)制來(lái)調(diào)度并發(fā)事務(wù)的執(zhí)行,使一個(gè)事務(wù)的執(zhí)行不受其它事務(wù)的干擾。知識(shí)要點(diǎn):SQLServer登錄 事務(wù)處理 并發(fā)訪問(wèn) 鎖 事物隔離級(jí)別12.1事務(wù)處理12.2并發(fā)訪問(wèn)12.3鎖12.4事務(wù)隔離級(jí)別第12章并發(fā)控制本章導(dǎo)讀:12.1事務(wù)處理SQLServer提供了一種事務(wù)處理的機(jī)制,用于確保數(shù)據(jù)的一致性和完整性。在事務(wù)處理過(guò)程中,所有操作序列都作為一個(gè)獨(dú)立的邏輯單元被執(zhí)行。只有所有操作序列都正確地執(zhí)行完畢,事物處理才算成功提交,否則就回滾(撤銷)到事物處理前的數(shù)據(jù)狀態(tài)。12.1.1事務(wù)概述12.1.2事物模式12.1事務(wù)處理SQLServer提供了一種事務(wù)處理的12.1.1事務(wù)概述事務(wù)(Transaction)是一組不可分割的、可執(zhí)行的動(dòng)作序列,是數(shù)據(jù)處理的邏輯單元,其包含的動(dòng)作序列具有一定的偏序,即部分關(guān)鍵動(dòng)作序列的順序很重要,會(huì)影響事物運(yùn)行結(jié)果。事物是恢復(fù)和并發(fā)的基本單位。1.事物特性事務(wù)可以是一條或一組SQL語(yǔ)句,也可以是整個(gè)應(yīng)用程序,而一個(gè)應(yīng)用程序也可能包含多個(gè)事務(wù)。事務(wù)有4個(gè)特性:原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持續(xù)性(Durability),它們統(tǒng)稱為事務(wù)的ACID特性。(1)原子性:是指事務(wù)中操作序列邏輯上作為一個(gè)工作單元整體考慮,要么全都執(zhí)行,要么全都不執(zhí)行。(2)一致性:事務(wù)在完成時(shí),所有數(shù)據(jù)必須從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。在相關(guān)數(shù)據(jù)庫(kù)中,所有規(guī)則都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時(shí),所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)都必須是正確的。(3)隔離性:是指一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾,即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對(duì)并發(fā)執(zhí)行的其他事務(wù)是隔離的。一個(gè)事務(wù)能查看到另一個(gè)事物的數(shù)據(jù)狀態(tài),要么是修改它之前的狀態(tài),要么是修改它之后的狀態(tài),不會(huì)是中間狀態(tài)的數(shù)據(jù)。(4)持續(xù)性:也稱永久性(Permanence),事務(wù)完成之后,它對(duì)于系統(tǒng)的影響是永久性的,無(wú)論發(fā)生何種操作,即使出現(xiàn)系統(tǒng)故障也將一直保持磁盤上。12.1.1事務(wù)概述事務(wù)(Transaction)是一組12.1.1事務(wù)概述2.事物和批的區(qū)別一個(gè)事務(wù)中也可以擁有多個(gè)批,一個(gè)批里可以有多個(gè)SQL語(yǔ)句組成的事務(wù),事務(wù)內(nèi)批的多少不影響事務(wù)的提交或回滾操作。編寫應(yīng)用程序時(shí),一定要區(qū)分事務(wù)和批的差別:(1)批是一組整體編譯的SQL語(yǔ)句,事務(wù)是一組作為邏輯工作單元執(zhí)行的SQL語(yǔ)句。(2)批語(yǔ)句的組合發(fā)生在編譯時(shí)刻,事務(wù)中語(yǔ)句的組合發(fā)生在執(zhí)行時(shí)刻。(3)編譯時(shí),批中某條語(yǔ)句存在語(yǔ)法錯(cuò)誤,系統(tǒng)將終止批中所有語(yǔ)句;運(yùn)行時(shí),事務(wù)中某個(gè)數(shù)據(jù)修改違反約束、規(guī)則等,系統(tǒng)默認(rèn)只回退到產(chǎn)生該錯(cuò)誤的語(yǔ)句。12.1.1事務(wù)概述2.事物和批的區(qū)別12.1.2事物模式SQLServer中的事務(wù)模式包括3種工作方式:自動(dòng)提交事務(wù)、顯式事務(wù)和隱式事務(wù)。1.自動(dòng)提交事務(wù)自動(dòng)提交事務(wù)是由T-SQL語(yǔ)句的特點(diǎn)自動(dòng)劃分的事務(wù)。它是SQLServer的默認(rèn)模式,每條單獨(dú)的T-SQL語(yǔ)句都是一個(gè)事務(wù),自動(dòng)提交或回滾,無(wú)須指定任何控制語(yǔ)句控制事務(wù)。2.顯式事務(wù)顯式事務(wù)是由用戶顯式定義的事務(wù)。在顯式事務(wù)模式下,每個(gè)事物均以begintransaction語(yǔ)句定義事務(wù)開(kāi)始,用commit或rollback語(yǔ)句定義事務(wù)結(jié)束。主要事物控制語(yǔ)句如下:(1)begintransaction[事務(wù)名]:?jiǎn)?dòng)事務(wù);(2)committransaction[事務(wù)名]:提交事務(wù),提交的數(shù)據(jù)變成數(shù)據(jù)庫(kù)的永久部分;(3)rollbacktransaction[事務(wù)名]:回滾事務(wù),撤銷全部操作,回滾到事務(wù)開(kāi)始時(shí)狀態(tài);(4)savetransaction<事務(wù)名>:可選語(yǔ)句,在事務(wù)內(nèi)設(shè)置保存點(diǎn),可以使事物回滾到保存點(diǎn),而不是回滾到事務(wù)的起點(diǎn)。12.1.2事物模式SQLServer中的事務(wù)模式包括12.1.2事物模式【例12-1】定義一個(gè)事務(wù),向?qū)W生表中插入一條只包含學(xué)號(hào)、姓名和性別的記錄。usejxglgoselect次數(shù)=0,*from學(xué)生 --檢查當(dāng)前表的內(nèi)容gobegintransactioninsertinto學(xué)生(學(xué)號(hào),姓名,性別)values('11010101','司武長(zhǎng)','男')gosavetransactionlabelinsertinto學(xué)生(學(xué)號(hào),姓名,性別)values('11010101','那佳佳','女')select次數(shù)=1,*from學(xué)生 --顯示插入兩條記錄rollbacktransactionlabel --回滾到事物保存點(diǎn)

select次數(shù)=2,*from學(xué)生 --顯示第1次插入的記錄被撤銷了gorollbacktransactionselect次數(shù)=3,*from學(xué)生 --顯示第2次插入的記錄被撤銷了12.1.2事物模式【例12-1】定義一個(gè)事務(wù),向?qū)W生12.1.2事物模式3.隱式事務(wù)隱式事務(wù)是用setimplicittransactionson不明顯地定義事務(wù)開(kāi)始,用commit或rollback語(yǔ)句明顯地定義事務(wù)結(jié)束的事務(wù)。在隱式事務(wù)模式下,在當(dāng)前事務(wù)提交或回滾后,SQLServer自動(dòng)開(kāi)始下一個(gè)事務(wù)。主要事物模式設(shè)置語(yǔ)句如下:(1)設(shè)置隱性事務(wù)開(kāi)始模式:setimplicit_transactionson:?jiǎn)?dòng)隱性事務(wù)模式;setimplicit_transactionsoff:關(guān)閉隱性事務(wù)模式。(2)設(shè)置隱性事務(wù)回滾模式:setxact_aborton:當(dāng)事務(wù)中任一條語(yǔ)句運(yùn)行錯(cuò)誤時(shí),整個(gè)事務(wù)將終止并整體回滾;setxact_abortoff:當(dāng)事務(wù)中語(yǔ)句運(yùn)行錯(cuò)誤時(shí),將終止本條語(yǔ)句且只回滾本條語(yǔ)句。12.1.2事物模式3.隱式事務(wù)12.2并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)是允許多用戶同時(shí)使用的共享資源,當(dāng)多個(gè)事務(wù)并發(fā)訪問(wèn)(同時(shí)訪問(wèn)同一資源)時(shí),若不加控制就可能會(huì)彼此沖突,破壞了數(shù)據(jù)的完整性和一致性,從而產(chǎn)生負(fù)面影響。12.2.1并發(fā)概述12.2.2并發(fā)異常12.2.3并發(fā)調(diào)度12.2并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)是允許多用戶同時(shí)使用的共享資源,當(dāng)12.2.1并發(fā)概述如果事物是順序執(zhí)行的,即一個(gè)事物完成之后,再開(kāi)始另一個(gè)是事物,則稱這種執(zhí)行方式為串行執(zhí)行,如圖12-1a所示;如果數(shù)據(jù)庫(kù)管理系統(tǒng)可以同時(shí)接收多個(gè)事物,并且這些事物在時(shí)間上可以重疊執(zhí)行,則稱這種執(zhí)行方式為并行執(zhí)行。在單CPU系統(tǒng)中,同一時(shí)間只能有一個(gè)事物占據(jù)CPU。各事物交叉地使用CPU,這種并發(fā)方式交叉并發(fā)。在多CPU系統(tǒng)中,多個(gè)事物可以同時(shí)占據(jù)CPU,這種并發(fā)方式稱為同時(shí)并發(fā),如圖12-1b所示。在沒(méi)有特殊說(shuō)明的情況下,并發(fā)訪問(wèn)只考慮單CPU系統(tǒng)中的交叉并發(fā)的情況。12.2.1并發(fā)概述如果事物是順序執(zhí)行的,即一個(gè)事物完成12.2.1并發(fā)概述a)串行執(zhí)行 b)交叉并行執(zhí)行圖12-1多個(gè)事物的執(zhí)行情況12.2.1并發(fā)概述a)串行執(zhí)行 b)交叉并行執(zhí)行12.2.2并發(fā)異常并發(fā)訪問(wèn)帶來(lái)數(shù)據(jù)不一致性主要包括四類:丟失更新、不可重復(fù)讀、臟讀和幻讀。1.丟失更新(LostUpdate)丟失更新是指當(dāng)兩個(gè)或兩個(gè)以上的事物同時(shí)讀取同一數(shù)據(jù)并進(jìn)行修改,其中一個(gè)事物提交的修改結(jié)果破壞了另一個(gè)事物的提交的修改結(jié)果。丟失更新有兩類,分別介紹如下:(1)第一類丟失更新:一個(gè)事務(wù)在撤銷時(shí),把其它事務(wù)提交的更新數(shù)據(jù)覆蓋,如表12-1所示。12.2.2并發(fā)異常并發(fā)訪問(wèn)帶來(lái)數(shù)據(jù)不一致性主要包括四類12.2.2并發(fā)異常----第一類丟失更新12.2.2并發(fā)異常----第一類丟失更新12.2.2并發(fā)異常----第二類丟失更新(2)第二類丟失更新:一個(gè)事務(wù)在提交時(shí),把其它事務(wù)提交的更新數(shù)據(jù)覆蓋,如表12-2所示。表12-2第二類丟失更新12.2.2并發(fā)異常----第二類丟失更新(2)第二類丟12.2.2并發(fā)異常----2.臟讀(DirtyRead)2.臟讀(DirtyRead)臟讀就是指一個(gè)事務(wù)讀到另一事務(wù)尚未提交的更新數(shù)據(jù)(不正確的臨時(shí)數(shù)據(jù)),如表12-3所示。表12-3臟讀12.2.2并發(fā)異常----2.臟讀(DirtyRea12.2.2并發(fā)異常----不可重復(fù)讀3.不可重復(fù)讀(NonRepeatableRead)不可重復(fù)讀是指一個(gè)事務(wù)中在兩次讀取同一數(shù)據(jù)行的過(guò)程中,由于另一個(gè)事務(wù)的修改,導(dǎo)致了第一個(gè)事物兩次查詢結(jié)果不一樣,如表12-4所示。表12-4不可重復(fù)讀12.2.2并發(fā)異常----不可重復(fù)讀3.不可重復(fù)讀(N12.2.2并發(fā)異常----4.幻讀幻讀是指一個(gè)事務(wù)在執(zhí)行兩次查詢的過(guò)程中,由于另外一個(gè)事務(wù)插入或刪除了數(shù)據(jù)行,導(dǎo)致第一個(gè)事務(wù)的第二次查詢中發(fā)現(xiàn)新增或丟失數(shù)據(jù)行現(xiàn)象,如同幻覺(jué)一樣,如表12-5所示。表12-5幻讀12.2.2并發(fā)異常----4.幻讀幻讀是指

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論