版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、SQL Server 2012數(shù)據(jù)庫(kù)管理教程第第13章章第1313章 事務(wù)與鎖事務(wù)的概述創(chuàng)建事務(wù)鎖13.1 13.1 事務(wù)的概述13.1.1 13.1.1 事務(wù)的概念事務(wù)是構(gòu)成單一邏輯工作單元的操作集合。一個(gè)事務(wù)中可能只包含一個(gè)操作,也可能包含一系列的操作。這些操作要么全部執(zhí)行,要么全部不執(zhí)行。13.1.2 13.1.2 事務(wù)的狀態(tài)通常,一個(gè)事務(wù)會(huì)有兩種輸出結(jié)果。如果一個(gè)事務(wù)成功執(zhí)行,我們就說(shuō)這個(gè)事務(wù)被提交,數(shù)據(jù)庫(kù)會(huì)進(jìn)入一個(gè)新的一致?tīng)顟B(tài)。如果事務(wù)沒(méi)有成功執(zhí)行,那么事務(wù)會(huì)被中止,數(shù)據(jù)庫(kù)將回到事務(wù)開(kāi)始以前的那個(gè)一致?tīng)顟B(tài),這時(shí)稱事務(wù)被回滾。事務(wù)執(zhí)行過(guò)程中所處的各種可能的狀態(tài)如下圖所示。1 1)活動(dòng)狀
2、態(tài):事務(wù)執(zhí)行時(shí)處于該狀態(tài)。2 2)部分提交狀態(tài):事務(wù)的最后一條語(yǔ)句執(zhí)行之后進(jìn)入該狀態(tài)。3 3)失敗狀態(tài):當(dāng)事務(wù)中的操作不能繼續(xù)后進(jìn)入該狀態(tài)。4 4)中止?fàn)顟B(tài):事務(wù)回滾,并且數(shù)據(jù)庫(kù)已恢復(fù)到事務(wù)開(kāi)始執(zhí)行以前的狀態(tài)后,事務(wù)處于該狀態(tài)。5 5)提交狀態(tài):事務(wù)成功執(zhí)行之后進(jìn)入該狀態(tài)。事務(wù)從活動(dòng)狀態(tài)開(kāi)始,當(dāng)事務(wù)完成它的最后一條語(yǔ)句后就進(jìn)入了部分提交狀態(tài)。此刻,事務(wù)的全部操作已經(jīng)執(zhí)行完,但由于實(shí)際輸出可能仍臨時(shí)駐留在主存中,而在其成功完成前可能出現(xiàn)硬件故障。因此,事務(wù)仍有可能失敗,所以稱事務(wù)進(jìn)入部分提交狀態(tài)。接著數(shù)據(jù)庫(kù)系統(tǒng)將事務(wù)所做的更新寫(xiě)入磁盤(pán),確保即使出現(xiàn)故障,事務(wù)所做的更新也會(huì)保留在磁盤(pán)上。系統(tǒng)判定事
3、務(wù)不能繼續(xù)正常執(zhí)行后(如由于硬件或邏輯錯(cuò)誤),事務(wù)進(jìn)入失敗狀態(tài)。這種事務(wù)必須回滾,此時(shí),事務(wù)就進(jìn)入了中止?fàn)顟B(tài)。事務(wù)進(jìn)入中止?fàn)顟B(tài)后,系統(tǒng)有兩種選擇。1 1)重啟事務(wù):當(dāng)引起事務(wù)中止的錯(cuò)誤是軟件或硬件錯(cuò)誤,而不是事務(wù)內(nèi)部邏輯錯(cuò)誤時(shí),可以重新啟動(dòng)事務(wù)。重新啟動(dòng)的事務(wù)是一個(gè)新事務(wù)。2 2)殺死事務(wù):這樣做通常是由于事務(wù)內(nèi)部邏輯造成的錯(cuò)誤,只有重寫(xiě)應(yīng)用程序才能改正。事務(wù)的提交狀態(tài)和中止?fàn)顟B(tài)都是事務(wù)的結(jié)束狀態(tài)。13.1.3 13.1.3 事務(wù)的特性為了保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)總是正確的,要求事務(wù)必須滿足四個(gè)特性。我們將這四個(gè)特性簡(jiǎn)稱為ACIDACID,這個(gè)縮寫(xiě)來(lái)自于這四個(gè)特性的英文單詞的首字母。1 1)原子性(
4、AtomicityAtomicity):每一個(gè)事務(wù)是一個(gè)工作單元,它不能被分割成更小的部分。2 2)一致性(ConsistencyConsistency):一個(gè)事務(wù)對(duì)數(shù)據(jù)庫(kù)的更改必須保證數(shù)據(jù)庫(kù)從一個(gè)一致的狀態(tài)轉(zhuǎn)換到另一個(gè)一致的狀態(tài)3 3)隔離性(IsolationIsolation):即使多個(gè)事務(wù)可以并發(fā)執(zhí)行,事務(wù)之間也應(yīng)該彼此獨(dú)立。4 4)持久性(DurabilityDurability):一個(gè)事務(wù)成功提交之后,無(wú)論發(fā)生任何系統(tǒng)錯(cuò)誤,這個(gè)事務(wù)更改的數(shù)據(jù)將永久存在。當(dāng)用戶設(shè)計(jì)SQL ServerSQL Server事務(wù)時(shí),必須注意以下幾點(diǎn):1 1)定義事務(wù)的外延。開(kāi)發(fā)者需要定義事務(wù)從哪里開(kāi)始,
5、到哪里結(jié)束。事務(wù)越短越好,但是同時(shí)要做到盡量符合實(shí)際業(yè)務(wù)過(guò)程的需要。2 2)定義事務(wù)的錯(cuò)誤管理。在事務(wù)中,并不是所有的錯(cuò)誤都會(huì)使事務(wù)自動(dòng)回滾。開(kāi)發(fā)者應(yīng)該對(duì)事務(wù)中的錯(cuò)誤進(jìn)行管理,以保證錯(cuò)誤出現(xiàn)時(shí),使用專(zhuān)門(mén)的命令來(lái)回滾事務(wù)。3 3)正確使用隔離級(jí)別。如果將每個(gè)事務(wù)都與其他事務(wù)隔離開(kāi)來(lái)執(zhí)行,那么就會(huì)降低系統(tǒng)并行執(zhí)行的效率。在使用事務(wù)時(shí),如果能夠設(shè)定恰當(dāng)?shù)母綦x級(jí)別,那么既可以保證事務(wù)正確執(zhí)行,也可以發(fā)揮系統(tǒng)并行執(zhí)行的高效性。13.2 13.2 創(chuàng)建事務(wù)自動(dòng)提交事務(wù):SQL ServerSQL Server數(shù)據(jù)庫(kù)引擎的默認(rèn)模式。每個(gè)單獨(dú)的Transact-SQLTransact-SQL語(yǔ)句都在其完成后提
6、交,不必指定任何語(yǔ)句來(lái)控制事務(wù)。顯式事務(wù):每個(gè)事務(wù)均以BEGIN TRANSACTIONBEGIN TRANSACTION語(yǔ)句顯式開(kāi)始,以COMMITCOMMIT或ROLLBACKROLLBACK語(yǔ)句顯式結(jié)束。隱式事務(wù):在前一個(gè)事務(wù)完成時(shí)新事務(wù)即隱式啟動(dòng),但每個(gè)事務(wù)仍以COMMITCOMMIT或ROLLBACKROLLBACK語(yǔ)句顯式結(jié)束。在SQL Server 2012SQL Server 2012中,默認(rèn)情況下,事務(wù)按連接級(jí)別進(jìn)行管理,一個(gè)連接的事務(wù)模式發(fā)生變化對(duì)其他連接的事務(wù)模式?jīng)]有影響。每一個(gè)連接可以選擇使用以下三種事務(wù)模式中的一種。13.2.1 13.2.1 自動(dòng)提交事務(wù)SQL Se
7、rver 2012SQL Server 2012數(shù)據(jù)庫(kù)的所有數(shù)據(jù)處理都是以事務(wù)的形式完成的。也就是說(shuō),在SQL Server 2012SQL Server 2012中,如果用戶沒(méi)有顯式地定義事務(wù),系統(tǒng)會(huì)自動(dòng)為該處理定義事務(wù)。由SQL ServerSQL Server定義的事務(wù)稱為自動(dòng)提交事務(wù)。自動(dòng)提交事務(wù)模式是SQL ServerSQL Server的默認(rèn)模式。在該模式下,每個(gè)Transact-SQLTransact-SQL語(yǔ)句都是一個(gè)事務(wù)。如果這個(gè)語(yǔ)句成功地完成,則提交該語(yǔ)句;如果遇到錯(cuò)誤,則回滾該語(yǔ)句。USE jwUSE jwGOGOCREATE TABLE TeacherCREATE T
8、ABLE Teacher ( teacherid char(3) NOT NULL PRIMARY KEY, ( teacherid char(3) NOT NULL PRIMARY KEY, name varchar(50) name varchar(50) NOT NULL, NOT NULL, sex char(2) ) sex char(2) )GOGO【例13-113-1】在jwjw數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)新表,使用自動(dòng)提交事務(wù)模式向表中插入違反約束的記錄,觀察數(shù)據(jù)插入操作的結(jié)果,并分析自動(dòng)提交事務(wù)模式的特點(diǎn)。1 1)在查詢編輯器中,使用CREATE TABLECREATE TABLE語(yǔ)句來(lái)
9、創(chuàng)建一個(gè)數(shù)據(jù)表TeacherTeacher,通過(guò)在該數(shù)據(jù)表中插入數(shù)據(jù)來(lái)檢驗(yàn)事務(wù)的行為。2 2)在查詢編輯器窗口中向TeacherTeacher表插入三條記錄。INSERT INTO TeacherINSERT INTO Teacher VALUES(001, VALUES(001,李麗李麗, , 女女) ) INSERT INTO TeacherINSERT INTO Teacher VALUES(002,NULL, VALUES(002,NULL, 女女) ) INSERT INTO TeacherINSERT INTO Teacher VALUES(003, VALUES(003,楊育清楊
10、育清, , 男男) )GOGO3 3)執(zhí)行以上三個(gè)INSERTINSERT語(yǔ)句,因?yàn)榈诙€(gè)INSERTINSERT語(yǔ)句向namename列中插入NULLNULL,而該列被定義為不允許空,所以提示錯(cuò)誤消息,如下圖所示。4 4)輸入并執(zhí)行以下SELECTSELECT語(yǔ)句,檢查記錄是否已成功插入到TeacherTeacher表中。SELECT SELECT * * FROM Teacher FROM TeacherGOGO運(yùn)行結(jié)果如下圖所示。5 5)從圖中所示結(jié)果可以看出,第二條記錄沒(méi)有被插入,但是第一條和第三條記錄已被成功插入。13.2.2 13.2.2 顯式事務(wù)如果需要將多條語(yǔ)句放在一個(gè)事務(wù)中執(zhí)
11、行,那么用戶可以使用顯式事務(wù)模式。在該模式下,用戶需要定義事務(wù)從哪里開(kāi)始。如果事務(wù)能夠正確執(zhí)行,則提交事務(wù);如果事務(wù)不能正確執(zhí)行,則回滾事務(wù)。1 1定義顯式事務(wù)的語(yǔ)句BEGIN TRANSACTIONBEGIN TRANSACTION:用于定義一個(gè)事務(wù)的開(kāi)始點(diǎn)。COMMIT TRANSACTIONCOMMIT TRANSACTION:當(dāng)一個(gè)事務(wù)正確執(zhí)行完以后,使用該語(yǔ)句提交事務(wù),使事務(wù)對(duì)數(shù)據(jù)庫(kù)的更改能夠長(zhǎng)久保留。ROLLBACK TRANSACTIONROLLBACK TRANSACTION:如果事務(wù)執(zhí)行過(guò)程中發(fā)生了錯(cuò)誤,使用該語(yǔ)句回滾該事務(wù),使數(shù)據(jù)庫(kù)回到事務(wù)開(kāi)始以前的狀態(tài)。2 2捕獲錯(cuò)誤的語(yǔ)
12、句用戶設(shè)計(jì)的事務(wù)應(yīng)該具有捕獲錯(cuò)誤的功能。如果捕獲到錯(cuò)誤,則顯式地回滾事務(wù),否則顯式地提交事務(wù)??梢允褂肨RYTRYCATCHCATCH語(yǔ)句捕獲Transact-SQLTransact-SQL代碼中的錯(cuò)誤。該語(yǔ)句包括兩部分:一個(gè)TRYTRY塊和一個(gè)CATCHCATCH塊。如果在TRYTRY塊所包含的Transact-SQLTransact-SQL語(yǔ)句中檢測(cè)到錯(cuò)誤,控制將被傳遞到CATCHCATCH塊,所以,可以在CATCHCATCH塊中處理該錯(cuò)誤。TRYTRY塊以BEGIN TRYBEGIN TRY語(yǔ)句開(kāi)頭,以END TRYEND TRY語(yǔ)句結(jié)尾。在BEGIN BEGIN TRYTRY和END
13、TRYEND TRY語(yǔ)句之間可以指定一個(gè)或多個(gè)Transact-SQLTransact-SQL語(yǔ)句。CATCHCATCH塊必須緊跟TRYTRY塊。CATCHCATCH塊以BEGIN CATCHBEGIN CATCH語(yǔ)句開(kāi)頭,以END CATCHEND CATCH語(yǔ)句結(jié)尾。在Transact-SQLTransact-SQL中,每個(gè)TRYTRY塊僅與一個(gè)CATCHCATCH塊相關(guān)聯(lián)??梢栽赥RYTRYCATCHCATCH語(yǔ)句中使用以下錯(cuò)誤函數(shù)來(lái)捕獲錯(cuò)誤信息。ERROR_NUMBER( )ERROR_NUMBER( ):返回錯(cuò)誤號(hào)。ERROR_MESSAGE( )ERROR_MESSAGE( ):返
14、回錯(cuò)誤消息的完整文本。ERROR_SEVERITY( )ERROR_SEVERITY( ):返回錯(cuò)誤嚴(yán)重性。ERROR_STATE( )ERROR_STATE( ):返回錯(cuò)誤狀態(tài)號(hào)。ERROR_LINE( )ERROR_LINE( ):返回導(dǎo)致錯(cuò)誤的例程中的行號(hào)。ERROR_PROCEDURE( )ERROR_PROCEDURE( ):返回出現(xiàn)錯(cuò)誤的存儲(chǔ)過(guò)程或觸發(fā)器的名稱。【例13-213-2】 將例13-113-1的向TeacherTeacher表中插入三行數(shù)據(jù)的操作放在一個(gè)顯式事務(wù)中執(zhí)行,觀察執(zhí)行的結(jié)果。1 1)在查詢編輯器中輸入并執(zhí)行以下Transact-SQLTransact-SQL語(yǔ)
15、句。USE jwUSE jwGOGOTRUNCATE TABLE Teacher;TRUNCATE TABLE Teacher;GOGOBEGIN TRYBEGIN TRYBEGIN TRANSACTIONBEGIN TRANSACTIONINSERT INTO TeacherINSERT INTO TeacherVALUES(001, VALUES(001, 李麗李麗, , 女女) )INSERT INTO TeacherINSERT INTO TeacherVALUES(002,NULL, VALUES(002,NULL, 女女) )INSERT INTO TeacherINSERT IN
16、TO TeacherVALUES(003,VALUES(003,楊育清楊育清, , 男男) ) COMMIT TRANSACTION; COMMIT TRANSACTION;END TRYEND TRYBEGIN CATCHBEGIN CATCHSELECT ERROR_NUMBER( ) AS ErrorNumber,SELECT ERROR_NUMBER( ) AS ErrorNumber, ERROR_SEVERITY( ) AS ErrorSeverity, ERROR_SEVERITY( ) AS ErrorSeverity, ERROR_STATE( ) AS ErrorState
17、, ERROR_STATE( ) AS ErrorState, ERROR_LINE( ) AS ErrorLine, ERROR_LINE( ) AS ErrorLine, ERROR_MESSAGE( ) AS ErrorMessage; ERROR_MESSAGE( ) AS ErrorMessage; ROLLBACK TRANSACTION; ROLLBACK TRANSACTION;END CATCH;END CATCH;GOGO運(yùn)行結(jié)果如下圖所示。2 2)輸入并執(zhí)行以下SELECTSELECT語(yǔ)句檢查事務(wù)是否被回滾。SELECT SELECT * * FROM Teacher;
18、FROM Teacher;GOGO運(yùn)行結(jié)果如下圖所示。從圖中可以看出,從圖中可以看出,TeacherTeacher表中表中沒(méi)有任何記錄。因?yàn)榈诙l沒(méi)有任何記錄。因?yàn)榈诙lINSERTINSERT語(yǔ)句出現(xiàn)錯(cuò)誤,所以流程語(yǔ)句出現(xiàn)錯(cuò)誤,所以流程跳到跳到CATCHCATCH塊。在塊。在CATCHCATCH塊中,塊中,首先通過(guò)使用錯(cuò)誤函數(shù)顯示錯(cuò)誤信首先通過(guò)使用錯(cuò)誤函數(shù)顯示錯(cuò)誤信息,然后顯式地將整個(gè)事務(wù)回滾,息,然后顯式地將整個(gè)事務(wù)回滾,所以系統(tǒng)回到事務(wù)開(kāi)始以前的狀態(tài)。所以系統(tǒng)回到事務(wù)開(kāi)始以前的狀態(tài)。13.2.3 13.2.3 隱式事務(wù)當(dāng)連接以隱式事務(wù)模式進(jìn)行操作時(shí),SQL ServerSQL Serve
19、r將在提交或回滾當(dāng)前事務(wù)后自動(dòng)啟動(dòng)新事務(wù),無(wú)需描述事務(wù)的開(kāi)始。但是,用戶必須使用COMMITCOMMIT或ROLLBACKROLLBACK語(yǔ)句顯式地結(jié)束事務(wù)。將隱式事務(wù)模式設(shè)置為打開(kāi)之后,在首次執(zhí)行下表中的任何語(yǔ)句時(shí),都會(huì)自動(dòng)啟動(dòng)一個(gè)事務(wù)。隱式事務(wù)模式下能夠自動(dòng)啟動(dòng)一個(gè)事務(wù)的Transact-SQLTransact-SQL語(yǔ)句在發(fā)出COMMITCOMMIT或ROLLBACK ROLLBACK 語(yǔ)句之前,該事務(wù)將一直保持有效。在第一個(gè)事務(wù)被提交或回滾之后,下次當(dāng)連接執(zhí)行以上任何語(yǔ)句時(shí),都將自動(dòng)啟動(dòng)一個(gè)新事務(wù)?!纠?3-313-3】使用隱式事務(wù)模式,創(chuàng)建一個(gè)表Teacher2Teacher2,向表
20、中插入記錄,顯示插入操作的結(jié)果。1 1)在查詢編輯器中輸入并執(zhí)行以下Transact-SQLTransact-SQL語(yǔ)句,在當(dāng)前連接上設(shè)置隱式事務(wù)模式。SET IMPLICIT_TRANSACTIONS ON;SET IMPLICIT_TRANSACTIONS ON;GOGO2 2)在查詢編輯器中輸入并執(zhí)行以下Transact-SQLTransact-SQL語(yǔ)句創(chuàng)建表Teacher2Teacher2。USE jwUSE jwGOGOCREATE TABLE Teacher2(CREATE TABLE Teacher2( teacherid teacherid char(3) NOT NULL
21、PRIMARY KEY,char(3) NOT NULL PRIMARY KEY, name varchar(50); name varchar(50);GOGO3 3)使用系統(tǒng)函數(shù)TRANCOUNTTRANCOUNT來(lái)測(cè)試是否已經(jīng)打開(kāi)了一個(gè)事務(wù)。SELECT TRANCOUNT AS Transaction Count;SELECT TRANCOUNT AS Transaction Count;GOGO運(yùn)行結(jié)果如圖所示。從圖中所示的結(jié)果可以看出,當(dāng)前連接已經(jīng)打開(kāi)了一個(gè)事務(wù)。4 4)提交事務(wù)并再次使用系統(tǒng)函數(shù)TRANCOUNTTRANCOUNT測(cè)試當(dāng)前連接上打開(kāi)的事務(wù)。COMMIT TRANS
22、ACTION;COMMIT TRANSACTION;GOGOSELECT TRANCOUNT AS Transaction Count;SELECT TRANCOUNT AS Transaction Count;GOGO運(yùn)行結(jié)果如圖所示。由圖中所示結(jié)果可知,顯由圖中所示結(jié)果可知,顯示的結(jié)果為示的結(jié)果為0,也就是說(shuō),使用,也就是說(shuō),使用COMMIT TRANSACTION命令命令提交事務(wù)后,事務(wù)結(jié)束。提交事務(wù)后,事務(wù)結(jié)束。5 5)執(zhí)行以下語(yǔ)句關(guān)閉隱式事務(wù)模式。SET IMPLICIT_TRANSACTIONS OFF;SET IMPLICIT_TRANSACTIONS OFF;GOGO13.2.
23、4 13.2.4 嵌套事務(wù)顯式事務(wù)可以嵌套,即在一個(gè)顯式事務(wù)中可以嵌套另一個(gè)顯式事務(wù)?!纠?3-413-4】使用事務(wù)的嵌套。在外層事務(wù)中創(chuàng)建一個(gè)表格,在內(nèi)層嵌套的事務(wù)中向該表插入數(shù)據(jù)。內(nèi)層事務(wù)和外層事務(wù)分別被提交。1 1)輸入以下語(yǔ)句。USE jwUSE jwGOGOBEGIN TRANSACTIONBEGIN TRANSACTIONPRINT After the first begin-transaction:+CAST(TRANCOUNT AS char(1)PRINT After the first begin-transaction:+CAST(TRANCOUNT AS char(1)
24、CREATE TABLE TempTable (CREATE TABLE TempTable ( col1 int PRIMARY KEY, col1 int PRIMARY KEY, clo2 char(6) clo2 char(6)BEGIN TRANSACTIONBEGIN TRANSACTIONPRINT After the second begin-transaction:+CAST(TRANCOUNT AS char(1)PRINT After the second begin-transaction:+CAST(TRANCOUNT AS char(1)INSERT INTO Te
25、mpTableINSERT INTO TempTable VALUES(1,AAA) VALUES(1,AAA)COMMIT TRANSACTIONCOMMIT TRANSACTIONPRINT After the first commit-transaction:+CAST(TRANCOUNT AS char(1)PRINT After the first commit-transaction:+CAST(TRANCOUNT AS char(1)COMMIT TRANSACTIONCOMMIT TRANSACTIONPRINT After the second commit-transact
26、ion:+PRINT After the second commit-transaction:+ CAST(TRANCOUNT AS char(1) CAST(TRANCOUNT AS char(1)GOGO在上面的例子中,先在外層事務(wù)中定義了TempTableTempTable表,再開(kāi)始內(nèi)層事務(wù),并在內(nèi)層事務(wù)中使用INSERTINSERT語(yǔ)句向表中插入了一條記錄;然后依次提交內(nèi)層事務(wù)和外層事務(wù)。其中系統(tǒng)函數(shù)CASTCAST的作用是進(jìn)行類(lèi)型轉(zhuǎn)換,將系統(tǒng)函數(shù)TRANCOUNTTRANCOUNT返回的整型數(shù)值轉(zhuǎn)變?yōu)轭?lèi)型為char(1)char(1)的字符型數(shù)據(jù)輸出。2 2)執(zhí)行以上的語(yǔ)句,運(yùn)行結(jié)果
27、如下圖所示。從圖中的執(zhí)行結(jié)果中可以看出,每執(zhí)行一次BEGIN TRANSACTIONBEGIN TRANSACTION語(yǔ)句,便開(kāi)始一個(gè)新事務(wù),而且系統(tǒng)函數(shù)TRANCOUNTTRANCOUNT的值也會(huì)增加1 1。每執(zhí)行一次COMMIT TRANSACTIONCOMMIT TRANSACTION語(yǔ)句,可以關(guān)閉一層事務(wù),使系統(tǒng)函數(shù)TRANCOUNTTRANCOUNT的值減小1 1。當(dāng)系統(tǒng)函數(shù)TRANCOUNTTRANCOUNT的值減為0 0時(shí),最外層的事務(wù)也被關(guān)閉了。3 3)使用以下SELECTSELECT語(yǔ)句查看TempTableTempTable表中的記錄。SELECT SELECT * * F
28、ROM TempTable FROM TempTableGOGO運(yùn)行結(jié)果如下圖所示。【例13-513-5】將例13-413-4中的事務(wù)嵌套示例修改為:提交內(nèi)層事務(wù),但撤銷(xiāo)外層事務(wù)。1 1)刪除TempTableTempTable表。DROP TABLE TempTableDROP TABLE TempTableGOGO2 2)創(chuàng)建一個(gè)包含嵌套事務(wù)的事務(wù),提交內(nèi)層事務(wù),但撤銷(xiāo)外層事務(wù)。BEGIN TRANSACTIONBEGIN TRANSACTIONCREATE TABLE TempTable(CREATE TABLE TempTable( col1 int PRIMARY KEY, col1
29、 int PRIMARY KEY, clo2 char(6) clo2 char(6)BEGIN TRANSACTIONBEGIN TRANSACTIONINSERT INTO TempTableINSERT INTO TempTable VALUES(1,AAA) VALUES(1,AAA)COMMIT TRANSACTIONCOMMIT TRANSACTIONROLLBACK TRANSACTIONROLLBACK TRANSACTIONGOGO執(zhí)行以上語(yǔ)句,系統(tǒng)顯示正確執(zhí)行的消息,運(yùn)行結(jié)果如下圖所示。3 3)使用以下SELECTSELECT語(yǔ)句查看TempTableTempTable表中
30、的記錄。SELECT SELECT * * FROM TempTable FROM TempTableGOGO運(yùn)行結(jié)果顯示如下圖所示的錯(cuò)誤信息。從圖中所示結(jié)果可以看出,即使內(nèi)層事務(wù)被提交,如果外層事務(wù)被回滾,那么內(nèi)層事務(wù)也會(huì)回滾。也就是說(shuō),回滾外層事務(wù)時(shí),將創(chuàng)建表以及向表中插入記錄的操作全部回滾,表TempTableTempTable不存在?!纠?3-613-6】將例13-413-4中的事務(wù)嵌套示例修改為回滾內(nèi)層事務(wù),但提交外層事務(wù)。BEGIN TRANSACTIONBEGIN TRANSACTIONCREATE TABLE TempTable3(CREATE TABLE TempTable3
31、( col1 int PRIMARY KEY, col1 int PRIMARY KEY, clo2 char(6) clo2 char(6)BEGIN TRANSACTIONBEGIN TRANSACTIONINSERT INTO TempTable3INSERT INTO TempTable3 VALUES(1,AAA) VALUES(1,AAA)ROLLBACK TRANSACTIONROLLBACK TRANSACTIONCOMMIT TRANSACTIONCOMMIT TRANSACTIONGOGO執(zhí)行以上語(yǔ)句,系統(tǒng)顯示錯(cuò)誤提示,運(yùn)行結(jié)果如下圖所示。13.3 13.3 鎖提高吞吐量和
32、資源利用率。減少等待時(shí)間。13.3.1 13.3.1 鎖的概述1 1并發(fā)操作產(chǎn)生的問(wèn)題事務(wù)處理系統(tǒng)通常允許多個(gè)事務(wù)并發(fā)執(zhí)行。事務(wù)并發(fā)執(zhí)行有以下優(yōu)點(diǎn):但是,即使每個(gè)事務(wù)單獨(dú)執(zhí)行時(shí)都能正確執(zhí)行,當(dāng)它們并發(fā)執(zhí)行時(shí),數(shù)據(jù)庫(kù)的一致性也可能被破壞。下面來(lái)看幾個(gè)并發(fā)操作可能會(huì)引發(fā)的問(wèn)題。(1 1)丟失更新當(dāng)兩個(gè)或多個(gè)事務(wù)讀取同一數(shù)據(jù)項(xiàng),然后基于最初讀取的值更新該數(shù)據(jù)項(xiàng)時(shí),會(huì)發(fā)生丟失更新問(wèn)題。每個(gè)事務(wù)都不知道其他事務(wù)的存在,最后的更新將覆蓋其他事務(wù)所做的更新,這將導(dǎo)致數(shù)據(jù)更新丟失。(2 2)讀“臟”數(shù)據(jù)當(dāng)某個(gè)事務(wù)讀取其他事務(wù)正在更新的數(shù)據(jù)項(xiàng)時(shí),可能會(huì)發(fā)生讀“臟”數(shù)據(jù)的問(wèn)題。(3 3)不可重復(fù)讀當(dāng)某個(gè)事務(wù)多次讀
33、取同一數(shù)據(jù)項(xiàng),但讀取的結(jié)果卻不相同時(shí),稱為不可重復(fù)讀。(4 4)幻讀當(dāng)對(duì)某行執(zhí)行插入或刪除操作,而該行屬于某個(gè)事務(wù)正在讀取的行的范圍時(shí),會(huì)發(fā)生幻讀問(wèn)題。2 2封鎖技術(shù)數(shù)據(jù)庫(kù)管理系統(tǒng)引入鎖的機(jī)制來(lái)解決并發(fā)訪問(wèn)帶來(lái)的問(wèn)題。如果事務(wù)請(qǐng)求的鎖模式與已授予同一數(shù)據(jù)項(xiàng)的鎖模式發(fā)生沖突,則數(shù)據(jù)庫(kù)引擎實(shí)例將暫停事務(wù)請(qǐng)求直到第一個(gè)鎖釋放。基本的鎖模式包括共享鎖(S S鎖)和排他鎖(X X鎖)。共享鎖(S S鎖):當(dāng)事務(wù)獲得了數(shù)據(jù)項(xiàng)上的共享鎖后,該事務(wù)只能讀不能寫(xiě)該數(shù)據(jù)項(xiàng)。例如,SELECTSELECT語(yǔ)句只讀取數(shù)據(jù),所以事務(wù)中使用SELECTSELECT時(shí)會(huì)獲得相應(yīng)數(shù)據(jù)上的共享鎖。排他鎖(X X鎖):當(dāng)事務(wù)獲得
34、了數(shù)據(jù)項(xiàng)上的排他鎖后,該事務(wù)既可以讀也可以寫(xiě)該數(shù)據(jù)項(xiàng)。例如,在事務(wù)中使用INSERTINSERT,UPDATEUPDATE及DELETEDELETE語(yǔ)句時(shí),會(huì)獲得該相應(yīng)數(shù)據(jù)上的排他鎖。SQL Server 2012SQL Server 2012還提供了更新鎖(U U鎖)。當(dāng)SQL ServerSQL Server定位表中必須修改的行時(shí),這種鎖首先定義為共享鎖,但在執(zhí)行實(shí)際數(shù)據(jù)修改之前,這種鎖會(huì)升級(jí)為排他鎖。鎖定可分為三個(gè)不同的級(jí)別,可以在行、頁(yè)或表三個(gè)層次進(jìn)行鎖定。SQL ServerSQL Server以動(dòng)態(tài)增加機(jī)制為基礎(chǔ),自動(dòng)將資源鎖定在適合任務(wù)的級(jí)別,并盡量減小鎖定的開(kāi)銷(xiāo)。SQL ServerSQL Server總會(huì)嘗試精細(xì)地鎖住資源。在大多數(shù)情況下,它會(huì)首先基于行級(jí)加鎖,如果鎖住的行太多,會(huì)提升鎖至表級(jí)。這個(gè)過(guò)程是自動(dòng)完成的?!纠?3-7
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度行政合同行政主體特權(quán)在緊急情況下的適用合同4篇
- 2025版小學(xué)操場(chǎng)運(yùn)動(dòng)設(shè)施更新與維修合同3篇
- 體育會(huì)展客戶關(guān)系管理考核試卷
- 光纖通信在智能電網(wǎng)故障診斷中的應(yīng)用考核試卷
- 2025年土地轉(zhuǎn)讓合同
- 2025版停車(chē)場(chǎng)消防設(shè)施建設(shè)與維護(hù)服務(wù)合同3篇
- 2025版木工材料研發(fā)與勞務(wù)合作合同范本3篇
- 2025年寫(xiě)作創(chuàng)作分期付款合同
- 2025年加盟代理合約協(xié)議
- 2025年家庭矛盾仲裁協(xié)議
- 油氣行業(yè)人才需求預(yù)測(cè)-洞察分析
- 《數(shù)據(jù)采集技術(shù)》課件-Scrapy 框架的基本操作
- 2025年河北省單招語(yǔ)文模擬測(cè)試二(原卷版)
- 高一化學(xué)《活潑的金屬單質(zhì)-鈉》分層練習(xí)含答案解析
- DB34∕T 4010-2021 水利工程外觀質(zhì)量評(píng)定規(guī)程
- 理論力學(xué)智慧樹(shù)知到期末考試答案章節(jié)答案2024年中國(guó)石油大學(xué)(華東)
- 2024老年人靜脈血栓栓塞癥防治中國(guó)專(zhuān)家共識(shí)(完整版)
- 四年級(jí)上冊(cè)脫式計(jì)算100題及答案
- 上海市12校2023-2024學(xué)年高考生物一模試卷含解析
- 儲(chǔ)能電站火災(zāi)應(yīng)急預(yù)案演練
- 人教版(新插圖)二年級(jí)下冊(cè)數(shù)學(xué) 第4課時(shí)用“進(jìn)一法”和“去尾法”解決簡(jiǎn)單的實(shí)際問(wèn)題 教學(xué)課件
評(píng)論
0/150
提交評(píng)論