《數(shù)據(jù)庫原理與SQL 2012應(yīng)用教程》課件-第13章 事務(wù)、批、鎖和作業(yè)_第1頁
《數(shù)據(jù)庫原理與SQL 2012應(yīng)用教程》課件-第13章 事務(wù)、批、鎖和作業(yè)_第2頁
《數(shù)據(jù)庫原理與SQL 2012應(yīng)用教程》課件-第13章 事務(wù)、批、鎖和作業(yè)_第3頁
《數(shù)據(jù)庫原理與SQL 2012應(yīng)用教程》課件-第13章 事務(wù)、批、鎖和作業(yè)_第4頁
《數(shù)據(jù)庫原理與SQL 2012應(yīng)用教程》課件-第13章 事務(wù)、批、鎖和作業(yè)_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

ISBN978-7-111-50122-0第13章

事務(wù)、批、鎖和作業(yè)事務(wù)是一個(gè)邏輯工作單元,SQLServer2012提供了多種自動(dòng)的可以通過編程來完成的機(jī)制,包括事務(wù)日志、SQL事務(wù)控制語句,以及事務(wù)處理運(yùn)行過程中通過鎖定保證數(shù)據(jù)完整性的機(jī)制。到目前為止,數(shù)據(jù)庫都是在只有一個(gè)用戶在使用。但在現(xiàn)實(shí)中,特別是在網(wǎng)絡(luò)環(huán)境下,數(shù)據(jù)庫通常都是由許多用戶使用。當(dāng)多個(gè)用戶對(duì)數(shù)據(jù)庫并發(fā)訪問時(shí),為了確保事務(wù)完整性和數(shù)據(jù)庫一致性,需要使用鎖定。事務(wù)和鎖是兩個(gè)緊密聯(lián)系的概念。通過事務(wù)、批和鎖的使用,還可以監(jiān)測(cè)系統(tǒng),以及優(yōu)化物理數(shù)據(jù)庫。作業(yè)是一種多步執(zhí)行的任務(wù)。本章主要介紹SQLServer2012數(shù)據(jù)庫系統(tǒng)的事務(wù)和鎖的基本概念,事務(wù)、批、鎖的創(chuàng)建和使用,通過事務(wù)、批、鎖監(jiān)測(cè)系統(tǒng)和優(yōu)化物理數(shù)據(jù)庫的操作,以及作業(yè)的設(shè)置。13.1事務(wù)事務(wù)和存儲(chǔ)過程類似,由一系列T-SQL語句組成,是SQLServer2012系統(tǒng)的執(zhí)行單元。13.1.1事務(wù)概述在SQLServer2012中,事務(wù)要求處理時(shí)必須滿足ACID原則,即原子性(A)、一致性(C)、隔離性(I)和持久性(D)。1.原子性原子性也稱為自動(dòng)性,是指事務(wù)必須執(zhí)行一個(gè)完整的工作,要么執(zhí)行全部數(shù)據(jù)的操作,要么全部不執(zhí)行。2.一致性一致性是指當(dāng)事務(wù)完成時(shí),必須使所有的數(shù)據(jù)具有一致的狀態(tài)。3.隔離性隔離性也稱為獨(dú)立性,是指并行事務(wù)的修改必須與其他并行事務(wù)的修改相互獨(dú)立。一個(gè)事務(wù)處理的數(shù)據(jù),要么是其他事務(wù)執(zhí)行之前的狀態(tài),要么是其他事務(wù)執(zhí)行之后的狀態(tài)。但不能處理其他事務(wù)正在處理的數(shù)據(jù)。4.持久性持久性是指當(dāng)一個(gè)事務(wù)完成之后,將影響永久性地存于系統(tǒng)中,即事務(wù)的操作將寫入數(shù)據(jù)庫中。13.1.1事務(wù)概述事務(wù)的這種機(jī)制保證了一個(gè)事務(wù)或者提交后成功執(zhí)行,或者提交后失敗回滾,二者必居其一,因此,事務(wù)對(duì)數(shù)據(jù)的修改具有可恢復(fù)性,即當(dāng)事務(wù)失敗時(shí),它對(duì)數(shù)據(jù)的修改都會(huì)恢復(fù)到該事務(wù)執(zhí)行前的狀態(tài)。而使用一般的批處理,則有可能出現(xiàn)有的語句被執(zhí)行,而另外一些語句沒有被執(zhí)行的情況,從而有可能造成數(shù)據(jù)不一致。事務(wù)的工作原理如圖所示。13.1.1事務(wù)概述事務(wù)開始之后,事務(wù)所有的操作都陸續(xù)寫到事務(wù)日志中。這些任務(wù)操作在事務(wù)日志中記錄一個(gè)標(biāo)志,用于表示執(zhí)行了這種操作。當(dāng)取消這種事務(wù)時(shí),系統(tǒng)自動(dòng)執(zhí)行這種操作的反操作,保證系統(tǒng)的一致性。系統(tǒng)自動(dòng)生成一個(gè)檢查點(diǎn)機(jī)制,這個(gè)檢查點(diǎn)周期地發(fā)生。檢查點(diǎn)的周期是系統(tǒng)根據(jù)用戶定義的時(shí)間間隔和系統(tǒng)活動(dòng)的頻度由系統(tǒng)自動(dòng)計(jì)算出來的時(shí)間間隔。檢查點(diǎn)周期地檢查事務(wù)日志,如果在事務(wù)日志中,事務(wù)全部完成,那么檢查點(diǎn)將事務(wù)日志中的事務(wù)提交到數(shù)據(jù)庫中,并且在事務(wù)日志中做一個(gè)檢查點(diǎn)提交標(biāo)記。如果在事務(wù)日志中,事務(wù)沒有完成,那么檢查點(diǎn)將事務(wù)日志中的事務(wù)不提交到數(shù)據(jù)庫中,并且在事務(wù)日志中做一個(gè)檢查點(diǎn)未提交標(biāo)記。事務(wù)的恢復(fù)以及檢查點(diǎn)保護(hù)系統(tǒng)的完整和可恢復(fù),可以使用如圖所示的示例說明。13.1.2事務(wù)的類型根據(jù)事務(wù)的設(shè)置、用途的不同,SQLServer2012將事務(wù)分為多種類型。1.根據(jù)系統(tǒng)的設(shè)置分類根據(jù)系統(tǒng)的設(shè)置,SQLServer2012將事務(wù)分為兩種類型:系統(tǒng)提供的事務(wù)和用戶定義的事務(wù),分別簡(jiǎn)稱為系統(tǒng)事務(wù)和用戶定義事務(wù)。(1)系統(tǒng)事務(wù)系統(tǒng)提供的事務(wù)是指在執(zhí)行某些語句時(shí),一條語句就是一個(gè)事務(wù)。但這時(shí)要明確,一條語句的對(duì)象既可能是表中的一行數(shù)據(jù),也可能是表中的多行數(shù)據(jù),甚至是表中的全部數(shù)據(jù)。因此,只有一條語句構(gòu)成的事務(wù)也可能包含了多行數(shù)據(jù)的處理。系統(tǒng)提供的事務(wù)語句如下:ALTERTABLE、CREATE、DELETE、DROP、FETCH、GRANT、INSERT、OPEN、REVOKE、SELECT、UPDATE、TRUNCATETABLE這些語句本身就構(gòu)成了一個(gè)事務(wù)。13.1.2事務(wù)的類型【例13-1】

使用CREATETABLE創(chuàng)建一個(gè)表。CREATETABLEstu(idCHAR(10),nameCHAR(6),sexCHAR(2))這條語句本身就構(gòu)成了一個(gè)事務(wù)。這條語句由于沒有使用條件限制,那么這條語句就是創(chuàng)建包含3個(gè)列的表。要么創(chuàng)建全部成功,要么全部失敗。13.1.2事務(wù)的類型(2)用戶定義事務(wù)在實(shí)際應(yīng)用中,大多數(shù)的事務(wù)處理采用了用戶定義的事務(wù)來處理。在開發(fā)應(yīng)用程序時(shí),可以使用BEGINTRANSACTION語句來定義明確的用戶定義的事務(wù)。在使用用戶定義的事務(wù)時(shí),一定要注意事務(wù)必須有明確的結(jié)束語句來結(jié)束。如果不使用明確的結(jié)束語句來結(jié)束,那么系統(tǒng)可能把從事務(wù)開始到用戶關(guān)閉連接之間的全部操作都作為一個(gè)事務(wù)來對(duì)待。事務(wù)的明確結(jié)束可以使用兩個(gè)語句中的一個(gè):COMMIT語句和ROLLBACK語句。COMMIT語句是提交語句,將全部完成的語句明確地提交到數(shù)據(jù)庫中。ROLLBACK語句是取消語句,該語句將事務(wù)的操作全部取消,即表示事務(wù)操作失敗。13.1.2事務(wù)的類型2.根據(jù)運(yùn)行模式分類根據(jù)運(yùn)行模式,SQLServer2012將事務(wù)分為4種類型:自動(dòng)提交事務(wù)、顯式事務(wù)、隱式事務(wù)和批處理級(jí)事務(wù)。(1)自動(dòng)提交事務(wù)自動(dòng)提交事務(wù)是指每條單獨(dú)的語句都是一個(gè)事務(wù)。(2)顯式事務(wù)顯式事務(wù)指每個(gè)事務(wù)均以BEGINTRANSACTION語句顯式開始,以COMMIT或ROLLBACK語句顯式結(jié)束。(3)隱式事務(wù)隱式事務(wù)指在前一個(gè)事務(wù)完成時(shí)新事務(wù)隱式啟動(dòng),但每個(gè)事務(wù)仍以COMMIT或ROLLBACK語句顯式完成。(4)批處理級(jí)事務(wù)該事務(wù)只能應(yīng)用于多個(gè)活動(dòng)結(jié)果集(MARS),在MARS會(huì)話中啟動(dòng)的T-SQL顯式或隱式事務(wù)變?yōu)榕幚砑?jí)事務(wù)。當(dāng)批處理完成時(shí),沒有提交或回滾的批處理級(jí)事務(wù)自動(dòng)由SQLServer進(jìn)行回滾。13.1.3事務(wù)處理語句所有的T-SQL語句都是內(nèi)在的事務(wù)。SQLServer還包括事務(wù)處理語句,將SQLServer語句集合分組后形成單個(gè)的邏輯工作單元。事務(wù)處理語句包括:

BEGINTRANSACTION語句。

COMMITTRANSACTION語句。

ROLLBACKTRANSACTION語句。

SAVETRANSACTION語句。13.1.3事務(wù)處理語句1.BEGINTRANSACTION語句BEGINTRANSACTION語句定義一個(gè)顯式本地事務(wù)的起始點(diǎn),即事務(wù)的開始。其語法格式為:BEGIN{TRAN|TRANSACTION}[{transaction_name|@tran_name_variable}[WITHMARK['description']]][;]說明:①TRANSACTION關(guān)鍵字可以縮寫為TRAN。②transaction_name是事務(wù)名,@tran_name_variable是用戶定義的、含有效事務(wù)名稱的變量,該變量必須是字符數(shù)據(jù)類型。③WITHMARK指定在日志中標(biāo)記事務(wù),description是描述該標(biāo)記的字符串。13.1.3事務(wù)處理語句2.COMMITTRANSACTION語句COMMITTRANSACTION語句標(biāo)志一個(gè)成功的隱式事務(wù)或顯式事務(wù)的結(jié)束。其語法格式為:COMMIT{TRAN|TRANSACTION}[transaction_name|@tran_name_variable]][;]這里需要強(qiáng)調(diào)的是,僅當(dāng)事務(wù)被引用所有數(shù)據(jù)的邏輯都正確時(shí),T-SQL語句才應(yīng)發(fā)出COMMITTRANSACTION命令。當(dāng)在嵌套事務(wù)中使用時(shí),內(nèi)部事務(wù)的提交并不釋放資源或使其修改成為永久修改。只有在提交了外部事務(wù)時(shí),數(shù)據(jù)修改才具有永久性,而且資源才會(huì)被釋放。當(dāng)@@TRANCOUNT大于1時(shí),每發(fā)出一個(gè)COMMITTRANSACTION命令只會(huì)使@@TRANCOUNT按1遞減。當(dāng)@@TRANCOUNT最終遞減為0時(shí),將提交整個(gè)外部事務(wù)。13.1.3事務(wù)處理語句3.ROLLBACKTRANSACTION語句ROLLBACKTRANSACTION語句將顯式事務(wù)或隱式事務(wù)回滾到事務(wù)的起點(diǎn)或事務(wù)內(nèi)的某個(gè)保存點(diǎn),它也標(biāo)志一個(gè)事務(wù)的結(jié)束,也稱為撤銷事務(wù)。其語法格式如下:ROLLBACK{TRAN|TRANSACTION}[transaction_name|@tran_name_variable|savepoint_name|@savepoint_variable][;]ROLLBACKTRANSACTION清除自事務(wù)的起點(diǎn)或到某個(gè)保存點(diǎn)所做的所有數(shù)據(jù)修改。它還釋放由事務(wù)控制的資源。savepoint_name是SAVETRANSACTION語句中的savepoint_name。當(dāng)條件回滾應(yīng)只影響事務(wù)的一部分時(shí),可使用savepoint_name。@savepoint_variable是用戶定義的、包含有效保存點(diǎn)名稱的變量的名稱,必須是字符數(shù)據(jù)類型。13.1.3事務(wù)處理語句4.SAVETRANSACTION語句SAVETRANSACTION語句在事務(wù)內(nèi)設(shè)置保存點(diǎn)。其語法格式為:SAVE{TRAN|TRANSACTION}{savepoint_name|@savepoint_variable}[;]用戶可以在事務(wù)內(nèi)設(shè)置保存點(diǎn)或標(biāo)記。保存點(diǎn)可以定義在按條件取消某個(gè)事務(wù)的一部分后,該事務(wù)可以返回的一個(gè)位置。如果將事務(wù)回滾到保存點(diǎn),則根據(jù)需要必須完成其他剩余的T-SQL語句和COMMITTRANSACTION語句,或者必須通過將事務(wù)回滾到起始點(diǎn)完全取消事務(wù)。若要取消整個(gè)事務(wù),請(qǐng)使用ROLLBACKTRANSACTIONtransaction_name語句。這將撤銷事務(wù)的所有語句和過程。savepoint_name是分配給保存點(diǎn)的名稱。@savepoint_variable包含有效保存點(diǎn)名稱的用戶定義變量的名稱。13.1.3事務(wù)處理語句【例13-2】

定義一個(gè)事務(wù),將所有圖書類型TypeID為3的圖書單價(jià)漲1.5元,并提交該事務(wù)。USEPUBLISHGODECLARE@b_priceNCHAR(10)SET@b_price='add_price'BEGINTRANSACTION@b_priceUPDATEBookSETPrice=Price+1.5WHEREtypeID=3COMMITTRANSACTION@b_priceGO本例使用BEGINTRANSACTION定義了一個(gè)事務(wù)名為add_price的事務(wù),之后使用COMMITTRANSACTION提交,即執(zhí)行該事務(wù),將所有滿足條件的圖書單價(jià)加1.5。13.1.3事務(wù)處理語句【例13-3】

定義一個(gè)事務(wù),向Author表中添加一條記錄,并設(shè)置保存點(diǎn)。然后再刪除該記錄,并回滾到事務(wù)的保存點(diǎn),提交該事務(wù)。USEPUBLISHGOBEGINTRANSACTIONINSERTINTOTypeVALUES('8','音樂')SAVETRANSACTIONsavetypeDELETEFROMTypeWHERETypeID='8'ROLLBACKTRANSACTIONsavetypeCOMMITTRANSACTIONGO該操作對(duì)Type表影響兩次。本例使用BEGINTRANSACTION定義了一個(gè)事務(wù),向表添加一條記錄,并設(shè)置保存點(diǎn)savetype。之后再刪除該記錄,并回滾到事務(wù)的保存點(diǎn)savetype處,使用COMMITTRANSACTION提交。打開表記錄,結(jié)果該記錄沒有被刪除。13.1.3事務(wù)處理語句【例13-4】

定義一個(gè)事務(wù),向Book表中添加記錄。如果添加成功,則將TypeID號(hào)為8的類型名改為“藝術(shù)”。否則不操作。USEPUBLISHGOBEGINTRANINSERTINTOBookVALUES('1436','SQLServer2012','3081','32','1')IF@@error=0BEGINPRINT'添加成功!'UPDATETypeSETTypeName='藝術(shù)'WHERETypeID='8'COMMITTRANENDELSEBEGINPRINT'添加失??!'ROLLBACKTRANEND該操作對(duì)Type表影響兩次。本例使用BEGINTRANSACTION定義了一個(gè)事務(wù),向表添加一條記錄,如果成功,打印一行提示“添加成功”。然后修改數(shù)據(jù)。如果不成功,打印一行提示“添加失敗”,則事務(wù)回滾到初始狀態(tài)。如果讀者有興趣,可以實(shí)驗(yàn)添加失敗的操作。13.1.4事務(wù)和批如果用戶希望或者整個(gè)操作完成,或者什么都不做,這時(shí)解決問題的辦法就是將整個(gè)操作組織成一個(gè)簡(jiǎn)單的事務(wù)處理,稱為批處理或批。【例13-5】

將多個(gè)操作定義為一個(gè)事務(wù)。USECOLLEGEGOBEGINTRANSACTIONUPDATEMarkSETScore=Score-2WHERECourseID=5INSERTINTOCourseVALUES('508','C#編程',4)SELECTName,SexFROMStudentWHERENameLIKE'張%'COMMITTRANSACTION將多個(gè)SQL操作定義為一個(gè)事務(wù),這時(shí)就形成了一個(gè)批處理,要么全部執(zhí)行,要么都不執(zhí)行。13.1.5事務(wù)隔離級(jí)每個(gè)事務(wù)都是一個(gè)所謂的隔離級(jí),它定義了用戶彼此之間的隔離和交互的程度。事務(wù)型關(guān)系型數(shù)據(jù)庫管理系統(tǒng)的一個(gè)重要的屬性就是,它可以隔離在服務(wù)器上正在處理的不同的會(huì)話。在單用戶的環(huán)境中,這個(gè)屬性無關(guān)緊要。但在多用戶環(huán)境下,能夠隔離事務(wù)就顯得非常重要。這樣它們之間既不互相影響,還能保證數(shù)據(jù)庫性能不受影響。SQLServer2012提供了5種隔離級(jí):未提交讀(READUNCOMMITTED)、提交讀(READCOMMITTED)、可重復(fù)讀(REPEATABLEREAD)、快照(SNAPSHOT)和序列化(SERIALIZABLE)。13.1.5事務(wù)隔離級(jí)在SQLServer中,使用SETTRANSACTIONISOLATIONLEVEL語句定事務(wù)的隔離級(jí)別。例如,在查詢窗口中輸入以下T-SQL語句并執(zhí)行:USECOLLEGEGOBEGINTRANUPDATECourseSETCourseName='足球'WHERECourseID=131再打開另一個(gè)查詢窗口輸入以下T-SQL語句并執(zhí)行:USECOLLEGEGOSELECT*FROMCourseGO13.1.5事務(wù)隔離級(jí)由于在前一段T-SQL語句中創(chuàng)建了一個(gè)事務(wù),但沒有COMMIT語句,即該事務(wù)沒有結(jié)束或被撤銷,所以后一段T-SQL語句執(zhí)行后,系統(tǒng)提示正在執(zhí)行查詢,而不顯示查詢結(jié)果。這時(shí)候的COLLEGE數(shù)據(jù)庫的默認(rèn)隔離級(jí)別是為提交讀,如果一個(gè)事務(wù)更新了數(shù)據(jù),但事務(wù)尚未結(jié)束,這時(shí)就會(huì)發(fā)生臟讀的情況。在第一個(gè)查詢窗口中使用ROLLBACK語句回滾以上操作,或直接關(guān)閉查詢窗口終止事務(wù)。這時(shí)使用SET語句設(shè)置事務(wù)的隔離級(jí)別為READUNCOMMITTED,執(zhí)行如下語句:SETTRANSACTIONISOLATIONLEVELREADUNCOMMITTED再重復(fù)剛才的查詢操作,就可以看到查詢結(jié)果,因?yàn)榇藭r(shí)系統(tǒng)被設(shè)置了READUNCOMMITTED,允許可以進(jìn)行臟讀。13.2鎖鎖就是防止其他事務(wù)訪問指定的資源的手段。鎖是實(shí)現(xiàn)并發(fā)控制的主要方法,是多個(gè)用戶能夠同時(shí)操縱同一個(gè)數(shù)據(jù)庫中的數(shù)據(jù)而不發(fā)生數(shù)據(jù)不一致現(xiàn)象的重要保障。SQLServer系統(tǒng)中的鎖,大多數(shù)情況下都是系統(tǒng)自動(dòng)設(shè)置生成的,用戶通常不需要特別設(shè)置,所以本書只簡(jiǎn)單的介紹其概念和簡(jiǎn)單查看。13.2.1鎖概述鎖是防止其他事務(wù)訪問指定的資源控制、實(shí)現(xiàn)并發(fā)控制的一種主要手段。為了提高系統(tǒng)的性能、加快事務(wù)的處理速度、縮短事務(wù)的等待時(shí)間,應(yīng)該使鎖定的資源最小化。為了控制鎖定的資源,應(yīng)該首先了解系統(tǒng)的空間管理。在SQLServer2012中,最小的空間管理單位是頁,一個(gè)頁有8KB。所有的數(shù)據(jù)、日志、索引都存放在頁上。另外,使用頁有一個(gè)限制,這就是表中的一行數(shù)據(jù)必須在同一個(gè)頁上,不能跨頁。頁上面的空間管理單位是簇,一個(gè)簇是8個(gè)連續(xù)的頁。表和索引的最小占用單位是簇。數(shù)據(jù)庫是由一個(gè)或者多個(gè)表或者索引組成,即由多個(gè)簇組成。SQLServer2012系統(tǒng)的空間管理結(jié)構(gòu)示意圖如圖所示。13.2.2鎖的模式數(shù)據(jù)庫引擎使用不同的鎖模式鎖定資源,這些鎖模式確定了并發(fā)事務(wù)訪問資源的方式。根據(jù)鎖定資源的方式的不同,SQLServer2012提供了4種鎖模式:共享鎖、排他鎖、更新鎖、意向鎖。1.共享鎖共享鎖也稱為S鎖,允許并行事務(wù)讀取同一種資源,這時(shí)的事務(wù)不能修改訪問的數(shù)據(jù)。當(dāng)使用共享鎖鎖定資源時(shí),不允許修改數(shù)據(jù)的事務(wù)訪問數(shù)據(jù)。當(dāng)讀取數(shù)據(jù)的事務(wù)讀完數(shù)據(jù)之后,立即釋放所占用的資源。一般地,當(dāng)使用SELECT語句訪問數(shù)據(jù)時(shí),系統(tǒng)自動(dòng)對(duì)所訪問的數(shù)據(jù)使用共享鎖鎖定。2.排他鎖對(duì)于那些修改數(shù)據(jù)的事務(wù),例如,使用INSERT、UPDATE和DELETE語句,系統(tǒng)自動(dòng)在所修改的事務(wù)上放置排他鎖。排他鎖也稱為X鎖,就是在同一時(shí)間內(nèi)只允許一個(gè)事務(wù)訪問一種資源,其他事務(wù)都不能在有排他鎖的資源上訪問。在有排他鎖的資源上,不能放置共享鎖,也就是說,不允許可以產(chǎn)生共享鎖的事務(wù)訪問這些資源。只有當(dāng)產(chǎn)生排他鎖的事務(wù)結(jié)束之后,排他鎖鎖定的資源才能被其他事務(wù)使用。3.更新鎖更新鎖也稱為U鎖,可以防止常見的死鎖。在可重復(fù)讀或可序列化事務(wù)中,此事務(wù)讀取數(shù)據(jù),獲取資源的共享鎖,然后修改數(shù)據(jù)。此操作要求鎖轉(zhuǎn)換為排他鎖。如果兩個(gè)事務(wù)獲得了資源上的共享模式鎖,然后試圖同時(shí)更新數(shù)據(jù),則一個(gè)事務(wù)嘗試將鎖轉(zhuǎn)換為排他鎖。共享模式到排他鎖的轉(zhuǎn)換必須等待一段時(shí)間,因?yàn)橐粋€(gè)事務(wù)的排他鎖與其他事務(wù)的共享模式鎖不兼容,發(fā)生鎖等待。第二個(gè)事務(wù)試圖獲取排他鎖以進(jìn)行更新。由于兩個(gè)事務(wù)都要轉(zhuǎn)換為排他鎖,并且每個(gè)事務(wù)都等待另一個(gè)事務(wù)釋放共享模式鎖,因此發(fā)生死鎖。13.2.2鎖的模式4.意向鎖數(shù)據(jù)庫引擎使用意向鎖來保護(hù)共享鎖或排他鎖放置在鎖層次結(jié)構(gòu)的底層資源上。之所以命名為意向鎖,是因?yàn)樵谳^低級(jí)別鎖前可獲取它們,因此,會(huì)通知意向?qū)㈡i放置在較低級(jí)別上。意向鎖有兩種用途:1)防止其他事務(wù)以會(huì)使較低級(jí)別的鎖無效的方式修改較高級(jí)別資源。2)提高數(shù)據(jù)庫引擎在較高的粒度級(jí)別檢測(cè)鎖沖突的效率。意向鎖又分為意向共享鎖(IS)、意向排他鎖(IX)以及意向排他共享鎖(SIX)。意向共享鎖表示讀低層次資源的事務(wù)的意向,把共享鎖放在這些單個(gè)的資源上。意向排它鎖表示修改低層次的事務(wù)的意向,把排它鎖放在這些單個(gè)資源上。意向排它鎖包括意向共享鎖,它是意向共享鎖的超集。使用意向排它的共享鎖表示允許并行讀取頂層資源的事務(wù)的意向,并且修改一些低層次的資源,把意向排它鎖放在這些單個(gè)資源上。例如,表上的一個(gè)使用意向排它的共享鎖把共享鎖放在表上,允許并行讀取,并且把意向排它鎖放在將要修改的頁上,把排它鎖放在修改的行上。每一個(gè)表一次只能有一個(gè)使用意向排它的共享鎖因?yàn)楸砑?jí)共享鎖阻止對(duì)表的任何修改。使用意向排它的共享鎖是共享鎖和意向排它鎖的組合。13.2.3鎖的信息鎖兼容性控制多個(gè)事務(wù)能否同時(shí)獲取同一資源上的鎖。如果資源已被另一事務(wù)鎖定,則僅當(dāng)請(qǐng)求鎖的模式與現(xiàn)有鎖的模式兼容時(shí),才會(huì)授予新的鎖請(qǐng)求。如果請(qǐng)求鎖的模式與現(xiàn)有鎖的模式不兼容,則請(qǐng)求新鎖的事務(wù)將等待釋放現(xiàn)有鎖或等待鎖超時(shí)間隔過期。例如,沒有與排他鎖兼容的鎖模式。如果具有排他鎖,則在釋放排他鎖之前,其他事務(wù)均無法獲取該資源的任何類型(共享、更新或排他)的鎖。另一種情況是,如果共享鎖已應(yīng)用到資源,則即使第一個(gè)事務(wù)尚未完成,其他事務(wù)也可以獲取該項(xiàng)的共享鎖或更新鎖。但是,在釋放共享鎖之前,其他事務(wù)無法獲取排他鎖。表13-1列出了各種鎖之間的兼容性。表13-1各種鎖之間的兼容性鎖

式ISSUIXSIXXIS兼容兼容兼容兼容兼容不兼容S兼容兼容兼容不兼容不兼容不兼容U兼容兼容不兼容不兼容不兼容不兼容IX兼容不兼容不兼容不兼容不兼容不兼容SIX兼容不兼容不兼容不兼容不兼容不兼容X不兼容不兼容不兼容不兼容不兼容不兼容13.2.3鎖的信息用戶可以使用SQLServer2012的性能工具SQLServerProfiler,指定用來捕獲有關(guān)跟蹤鎖事件的信息和鎖事件類別。還可以在系統(tǒng)監(jiān)視器中,從鎖對(duì)象指定計(jì)數(shù)器來監(jiān)視數(shù)據(jù)庫引擎實(shí)例中的鎖級(jí)別。啟動(dòng)SQLServerProfiler,可以選擇SQLServerManagementStudio菜單“工具”的“SQLServerProfiler”選項(xiàng)。也可以選擇系統(tǒng)開始菜單中的SQLServerProfile,如圖所示。13.2.3鎖的信息進(jìn)入SQLServerProfiler,如圖所示。選擇系統(tǒng)菜單“文件”的“新建跟蹤”選項(xiàng),新建一個(gè)跟蹤事件,如圖所示。13.2.3鎖的信息連接到服務(wù)器,如圖所示。連接成功,出現(xiàn)“跟蹤屬性”對(duì)話框。“常規(guī)”選項(xiàng)頁中,用戶可以設(shè)置跟蹤名稱、使用模板,以及啟用跟蹤停止時(shí)間和將跟蹤存儲(chǔ)到指定文件,例如將跟蹤結(jié)果存儲(chǔ)到master系統(tǒng)數(shù)據(jù)庫的tracks表中。如圖所示。13.2.3鎖的信息“跟蹤屬性”對(duì)話框的“事件選擇”頁中,用戶可以檢查選定要跟蹤的事件。在圖所示。選擇“運(yùn)行”,在SQLServerProfiler主窗口中新建一個(gè)跟蹤窗口。當(dāng)操作SQLServer2012時(shí),跟蹤窗口會(huì)顯示用戶的每一步操作,以及SQLServer2012每一刻的運(yùn)行情況。在圖所示。13.2.3鎖的信息同時(shí),在master系統(tǒng)數(shù)據(jù)庫中新建一個(gè)tracks表。打開該表,顯示用戶設(shè)置跟蹤的事件以及事件的列。如圖所示。13.2.4死鎖及處理在事務(wù)和鎖的使用過程中,死鎖是一個(gè)不可避免的現(xiàn)象。在下列兩種情況下,可以發(fā)生死鎖。第一種情況是,當(dāng)兩個(gè)事務(wù)分別鎖定了兩個(gè)單獨(dú)的對(duì)象,這時(shí)每一個(gè)事務(wù)都要求在另外一個(gè)事務(wù)鎖定的對(duì)象上獲得一個(gè)鎖,因此每一個(gè)事務(wù)都必須等待另外一個(gè)事務(wù)釋放占有的鎖,這時(shí),就發(fā)生了死鎖。這種死鎖是最典型的死鎖形式。死鎖的第二種情況是,當(dāng)在一個(gè)數(shù)據(jù)庫中,有若干個(gè)長時(shí)間運(yùn)行的事務(wù)執(zhí)行并行的操作,當(dāng)查詢分析器處理一種非常復(fù)雜的查詢例如連接查詢時(shí),那么由于不能控制處理的順序,有可能發(fā)生死鎖現(xiàn)象。13.2.4死鎖及處理用戶可以使用SQLServerProfiler確定死鎖的原因。當(dāng)SQLServer中某組資源的兩個(gè)或多個(gè)線程或進(jìn)程之間存在循環(huán)的依賴關(guān)系時(shí),將會(huì)發(fā)生死鎖。使用SQLServerProfiler,可以創(chuàng)建記錄、重播和顯示死鎖事件的跟蹤以進(jìn)行分析。若要跟蹤死鎖事件,請(qǐng)將Deadlockgraph事件類添加到跟蹤。可以在配置跟蹤時(shí),使用“事件提取設(shè)置”選項(xiàng)卡。請(qǐng)注意,只有在“事件選擇”選項(xiàng)卡上選擇了Deadlockgraph事件,才會(huì)出現(xiàn)此選項(xiàng)卡。如圖所示。13.3數(shù)據(jù)庫優(yōu)化一個(gè)數(shù)據(jù)庫系統(tǒng)的性能依賴于組成這些系統(tǒng)的數(shù)據(jù)庫中物理設(shè)計(jì)結(jié)構(gòu)的有效配置。這些物理設(shè)計(jì)結(jié)構(gòu)包括索引、聚集索引、索引視圖和分區(qū)等,其目的在于提高數(shù)據(jù)庫的性能和可管理性。SQLServer2012提供了一套綜合的工具,用于優(yōu)化物理數(shù)據(jù)庫的設(shè)計(jì),其中數(shù)據(jù)庫引擎優(yōu)化顧問,是分析一個(gè)或多個(gè)數(shù)據(jù)庫上工作負(fù)荷(對(duì)要優(yōu)化的數(shù)據(jù)庫執(zhí)行的一組T-SQL語句)的性能效果的工具。13.3.1數(shù)據(jù)庫引擎優(yōu)化顧問概述數(shù)據(jù)庫引擎優(yōu)化顧問是一種工具,用于分析在一個(gè)或多個(gè)數(shù)據(jù)庫中運(yùn)行的工作負(fù)荷的性能效果。工作負(fù)荷是對(duì)要優(yōu)化的數(shù)據(jù)庫執(zhí)行的一組T-SQL語句。分析數(shù)據(jù)庫的工作負(fù)荷效果后,數(shù)據(jù)庫引擎優(yōu)化顧問會(huì)提供在SQLServer2012數(shù)據(jù)庫中添加、刪除或修改物理設(shè)計(jì)結(jié)構(gòu)的建議。這些物理性能結(jié)構(gòu)包括聚集索引、非聚集索引、索引視圖和分區(qū)。實(shí)現(xiàn)這些結(jié)構(gòu)之后,數(shù)據(jù)庫引擎優(yōu)化顧問使查詢處理器能夠用最短的時(shí)間執(zhí)行工作負(fù)荷任務(wù)。13.3.2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論