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

下載本文檔

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

文檔簡介

大型數(shù)據(jù)庫系統(tǒng)管理、設(shè)計與實例分析

——基于SQLServer

SQLServer事務和并發(fā)控制課件大型數(shù)據(jù)庫系統(tǒng)管理、設(shè)計與實例分析

——基于SQLServ1第8章SQLServer事務和并發(fā)控制8.1事務8.2事務的分類和控制8.3并發(fā)控制8.4事務處理實例分析

8.5分布式事務8.6并發(fā)控制

SQLServer事務和并發(fā)控制課件第8章SQLServer事務和并發(fā)控制8.128.1事務8.1.1事務的概念8.1.2事務對并發(fā)控制和保障數(shù)據(jù)完整的重要性SQLServer事務和并發(fā)控制課件8.1事務8.1.1事務的概念SQLServer事38.1.1事務的概念事務是一個用戶定義的完整的工作單元,一個事務內(nèi)的所有語句被作為整體執(zhí)行,要么全部執(zhí)行,要么全部不執(zhí)行。遇到錯誤時,可以回滾事務,取消事務內(nèi)所做的所有改變,從而保證數(shù)據(jù)庫中數(shù)據(jù)的一致性和可恢復性。SQLServer事務和并發(fā)控制課件8.1.1事務的概念事務是一個用戶定義的完整的工作單元,41、事務的特性(ACID)原子性(Atomicity):事務是數(shù)據(jù)庫的邏輯工作單位,事務中的操作要么都做,要么都不做。

一致性(Consistency):事務執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。隔離性(Isolation):一事務的執(zhí)行不能被其它事務干擾。持續(xù)性(永久性)(Durability):指事務一旦提交,則其對數(shù)據(jù)庫中數(shù)據(jù)的改變就應該是永久的

SQLServer事務和并發(fā)控制課件1、事務的特性(ACID)原子性(Atomicity):事務52、事務和批的區(qū)別編程時,一定要區(qū)分事務和批的差別:批是一組整體編譯的SQL語句,事務是一組作為單個邏輯工作單元執(zhí)行的SQL語句。批語句的組合發(fā)生在編譯時刻,事務中語句的組合發(fā)生在執(zhí)行時刻。當在編譯時,批中某個語句存在語法錯誤,系統(tǒng)將取消整個批中所有語句執(zhí)行,而在運行時刻,如果事務中某個數(shù)據(jù)修改違反約束、規(guī)則等,系統(tǒng)默認只回退到產(chǎn)生該錯誤的語句。如果批中產(chǎn)生一個運行時錯誤,系統(tǒng)默認只回退到產(chǎn)生該錯誤的語句。但當打開XACT_ABORT選項為ON時,可以系統(tǒng)自動回滾產(chǎn)生該錯誤的當前事務。一個事務中也可以擁有多個批,一個批里可以有多個SQL語句組成的事務,事務內(nèi)批的多少不影響事務的提交或回滾操作。SQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別編程時,一定要區(qū)分事務和批的差別:SQLS62、事務和批的區(qū)別SETXACT_ABORT指定當Transact-SQL語句產(chǎn)生運行時錯誤時,Microsoft?SQLServer?是否自動回滾當前事務。語法SETXACT_ABORT{ON|OFF}當SETXACT_ABORT為ON時,如果Transact-SQL語句產(chǎn)生運行時錯誤,整個事務將終止并回滾。為OFF時,只回滾產(chǎn)生錯誤的Transact-SQL語句,而事務將繼續(xù)進行處理。編譯錯誤(如語法錯誤)不受SETXACT_ABORT的影響。對于大多數(shù)OLEDB提供程序(包括SQLServer),隱性或顯式事務中的數(shù)據(jù)修改語句必須將XACT_ABORT設(shè)置為ON。唯一不需要該選項的情況是提供程序支持嵌套事務時。SQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別SETXACT_ABORTSQLServ72、事務和批的區(qū)別下例導致在含有其它Transact-SQL語句的事務中發(fā)生違反外鍵錯誤。在第一個語句集中產(chǎn)生錯誤,但其它語句均成功執(zhí)行且事務成功提交。在第二個語句集中,SETXACT_ABORT設(shè)置為ON。這導致語句錯誤使批處理終止,并使事務回滾。CREATETABLEt1(aintPRIMARYKEY)CREATETABLEt2(aintREFERENCESt1(a))GOINSERTINTOt1VALUES(1)INSERTINTOt1VALUES(3)INSERTINTOt1VALUES(4)INSERTINTOt1VALUES(6)GOSETXACT_ABORTOFFGOBEGINTRANINSERTINTOt2VALUES(1)INSERTINTOt2VALUES(2)/*Foreignkeyerror*/INSERTINTOt2VALUES(3)COMMITTRANGOSQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別下例導致在含有其它Transact-SQ82、事務和批的區(qū)別SETXACT_ABORTONGOBEGINTRANINSERTINTOt2VALUES(4)INSERTINTOt2VALUES(5)/*Foreignkeyerror*/INSERTINTOt2VALUES(6)COMMITTRANGO/*Selectshowsonlykeys1and3added.Key2insertfailedandwasrolledback,butXACT_ABORTwasOFFandrestoftransactionsucceeded.Key5inserterrorwithXACT_ABORTONcausedallofthesecondtransactiontorollback.*/SELECT*FROMt2GODROPTABLEt2DROPTABLEt1GOSQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別SETXACT_ABORTONSQLS92、事務和批的區(qū)別問題:如何知道XACT_ABORT為ON還是OFF呢?XACT_ABORT的默認值是什么?SQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別問題:如何知道XACT_ABORT為ON還102、事務和批的區(qū)別問題:如何知道XACT_ABORT為ON還是OFF呢?DBCCUSEROPTIONS:itwillshowassetifit'sON.Ifit'sOFFthenitwillnotshow

DBCCUSEROPTIONS返回當前連接的活動(設(shè)置)的SET選項??纯碫B的例子:運行DBCC(順便看一下聯(lián)機幫助文檔)并查看結(jié)果SQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別問題:如何知道XACT_ABORT為ON還112、事務和批的區(qū)別SETXACT_ABORT的默認值是什么?對每個連接來說,SETXACT_ABORT的默認值是OFF看看VB的例子和查詢分析器SQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別SETXACT_ABORT的默認值是什么128.1.2事務對并發(fā)控制和保障

數(shù)據(jù)完整的重要性1.事務與并發(fā)控制的關(guān)系如果在用戶并發(fā)訪問期間沒有保證多個事務正確的交叉運行,用戶操作相同的數(shù)據(jù)時可能會產(chǎn)生一些意想不到的問題。包括:(1)丟失修改或被覆蓋(火車票)(2)讀臟數(shù)據(jù)(銀行利息)(3)不能重復讀(學生成績)(4)幻影讀SQLServer事務和并發(fā)控制課件8.1.2事務對并發(fā)控制和保障

數(shù)據(jù)完整的重要性1.事132.事務對保障數(shù)據(jù)一致和完整性的作用故障輕則造成運行事務非正常中斷,影響數(shù)據(jù)庫中數(shù)據(jù)的正確性,重則破壞數(shù)據(jù)庫,使數(shù)據(jù)庫中全部或部分數(shù)據(jù)丟失。影響事務正常運行的故障有:(1)事務內(nèi)部的故障(2)系統(tǒng)故障(3)介質(zhì)故障(4)計算機病毒8.1.2事務對并發(fā)控制和保障

數(shù)據(jù)完整的重要性SQLServer事務和并發(fā)控制課件2.事務對保障數(shù)據(jù)一致和完整性的作用8.1.2事務對并148.2事務的分類和控制8.2.1事務的分類8.2.2事務控制SQLServer事務和并發(fā)控制課件8.2事務的分類和控制8.2.1事務的分類SQL158.2.1事務的分類SQLServer的事務模式可分為顯式事務、隱式事務和自動事務三種。1)顯式事務顯式事務是指由用戶執(zhí)行T-sql事務語句而定義的事務,這類事務又稱做用戶定義事務。定義事務的語句包括:BEGINTRANSACTION:標識一個事務的開始,即啟動事務。COMMITTRANSACTION、COMMITWORK:標識一個事務的結(jié)束,事務內(nèi)所修改的數(shù)據(jù)被永久保存到數(shù)據(jù)庫中。ROLLBACKTRANSACTION、ROLLBACKWORK:標識一個事務的結(jié)束,說明事務執(zhí)行過程中遇到錯誤,事務內(nèi)所修改的數(shù)據(jù)被回滾到事務執(zhí)行前的狀態(tài)。SQLServer事務和并發(fā)控制課件8.2.1事務的分類SQLServer的事務模式可分162)隱式事務在隱式事務模式下,在當前事務提交或回滾后,SQLServer自動開始下一個事務。所以,隱式事務不需要使用BEGINTRANSACTION語句啟動事務,而只需要用戶使用ROLLBACKTRANSACTION、ROLLBACKWORK、COMMITTRANSACTION、COMMITWORK等語句提交或回滾事務。在提交或回滾后,SQLServer自動開始下一個事務。執(zhí)行SETIMPLICIT_TRANSACTIONSON語句可使SQLServer進入隱式事務模式。在隱式事務模式下,當執(zhí)行下面任意一個語句時,可使SQLServer重新啟動一個事務:

所有CREATE語句ALTERTABLE所有DROP語句TRUNCATETABLEGRANTREVOKEINSERTUPDATEDELETESELECTOPENFETCH需要關(guān)閉隱式事務模式時,調(diào)用SET語句關(guān)閉IMPLICIT_TRANSACTIONSOFF連接選項即可。SQLServer事務和并發(fā)控制課件2)隱式事務SQLServer事務和并發(fā)控制課件173)自動事務模式在自動事務模式下,當一個語句被成功執(zhí)行后,它被自動提交,而當它執(zhí)行過程中產(chǎn)生錯誤時,被自動回滾。自動事務模式是SQLServer的默認事務管理模式,當與SQLServer建立連接后,直接進入自動事務模式,直到使用BEGINTRANSACTION語句開始一個顯式事務,或者打開IMPLICIT_TRANSACTIONS連接選項進入隱式事務模式為止。而當顯式事務被提交或IMPLICIT_TRANSACTIONS被關(guān)閉后,SQLServer又進入自動事務管理模式??纯碫B的例子SQLServer事務和并發(fā)控制課件3)自動事務模式SQLServer事務和并發(fā)控制課件18示例:BEGINTRANdemo SELECT*FROMStudent INSERTINTOStudentVALUES(‘9711112’,’張三’,…) SELECT*FROMStudent ROLLBACK--回滾整個事務或: COMMIT--提交事務SQLServer事務和并發(fā)控制課件示例:BEGINTRANdemoSQLServer198.2.2事務控制

SQLServer中有關(guān)事務的處理語句有:命令名作用格式BEGINTRANSACTION說明一個事務開始BEGINTRANsaction[<事務名>]COMMITTRANSACTION說明一個事務結(jié)束,它的作用是提交或確認事務已經(jīng)完成COMMITTRANsaction[<事務名>]SAVETRANSACTION用于在事務中設(shè)置一個保存點,目的是在撤消事務時可以只撤消部分事務,以提高系統(tǒng)的效率SAVETRANsaction<保存點>ROLLBACKTRANSACTION說明要撤消事務,即撤消在該事務中對數(shù)據(jù)庫所做的更新操作,使數(shù)據(jù)庫回退到BEGINTRANSACTION或保存點之前的狀態(tài)ROLLBACKTRANsaction[<事務名>|<保存點>]SQLServer事務和并發(fā)控制課件8.2.2事務控制SQLServer中有關(guān)事務的處理20Savetransaction示例(略)1:下例更改分給TheGourmetMicrowave的兩位作者的版稅。數(shù)據(jù)庫將會在兩個更新間不一致,因此必須將它們分組為用戶定義的事務。BEGINTRANSACTIONroyaltychangeUPDATEtitleauthorSETroyaltyper=65FROMtitleauthor,titlesWHEREroyaltyper=75ANDtitleauthor.title_id=titles.title_idANDtitle='TheGourmetMicrowave'UPDATEtitleauthorSETroyaltyper=35FROMtitleauthor,titlesWHEREroyaltyper=25ANDtitleauthor.title_id=titles.title_idANDtitle='TheGourmetMicrowave'SAVETRANSACTIONpercentchanged/*Afterhavingupdatedtheroyaltyperentriesforthetwoauthors,theuserinsertsthesavepointpercentchanged,andthendetermineshowa10-percentincreaseinthebook'spricewouldaffecttheauthors'royaltyearnings.*/SQLServer事務和并發(fā)控制課件Savetransaction示例(略)1:下例更改分給21Savetransaction示例(略)2:UPDATEtitlesSETprice=price*1.1WHEREtitle='TheGourmetMicrowave'SELECT(price*royalty*ytd_sales)*royaltyperFROMtitles,titleauthorWHEREtitle='TheGourmetMicrowave'ANDtitles.title_id=titleauthor.title_id/*ThetransactionisrolledbacktothesavepointwiththeROLLBACKTRANSACTIONstatement.*/ROLLBACKTRANSACTIONpercentchangedCOMMITTRANSACTION/*Endofroyaltychange.*/SQLServer事務和并發(fā)控制課件Savetransaction示例(略)2:SQLServ22說明:在定義一個事務時,BEGINTRANSACTION語句應與COMMITTRANSACTION語句或ROLLBACKTRANSACTION成對出現(xiàn)。在SQLServer中,事務定義語句可以嵌套,但實際上只有最外層的BEGINTRANSACTION語句和COMMITTRANSACTION語句才能建立和提交事務;在回滾事務時,也只能使用最外層定義的事務名或存儲點標記,而不能使用內(nèi)層定義的事務名。事務嵌套常用在存儲過程或觸發(fā)器內(nèi),它們可以使用BEGINTRANSACTION。。。COMMITTRANSACTION對來相互調(diào)用。SQLServer事務和并發(fā)控制課件說明:SQLServer事務和并發(fā)控制課件23說明:事務處理過程中的錯誤:如果服務器錯誤使事務無法成功完成,則SQLServer自動回滾該事務,并釋放該事務所占有的所有資源;如果客戶端與SQLServer的網(wǎng)絡(luò)連接中斷,那么當網(wǎng)絡(luò)告知SQLServer該中斷時,將回滾該連接所有未完成的事務;如果客戶端應用程序失敗或客戶計算機崩潰或重啟,也會中斷該連接,當SQLServer該中斷時,將回滾該連接所有未完成的事務;如果客戶從該應用程序注銷,所有未完成的事務也會被回滾。可以用聯(lián)網(wǎng)的兩臺計算機測試VB程序。SQLServer事務和并發(fā)控制課件說明:SQLServer事務和并發(fā)控制課件248.3.1編寫有效事務的指導原則

8.3.2避免并發(fā)問題

8.3編寫有效事務的建議

SQLServer事務和并發(fā)控制課件8.3.1編寫有效事務的指導原則8.3編寫有效事務258.3.1編寫有效事務的指導原則

1.不要在事務處理期間輸入數(shù)據(jù)

2.瀏覽數(shù)據(jù)時,盡量不要打開事務

3.保持事務盡可能的短

4.靈活地使用更低的事務隔離級別

5.在事務中盡量使訪問的數(shù)據(jù)量最小

SQLServer事務和并發(fā)控制課件8.3.1編寫有效事務的指導原則1.不要在事務處理期間268.3.2避免并發(fā)問題

為了防止并發(fā)問題,應該小心地管理隱性事務。在使用隱性事務時,COMMIT或ROLLBACK之后的下一個Transact-SQL語句會自動啟動一個新事務。這可能在應用程序瀏覽數(shù)據(jù)時,甚至在要求用戶輸入時,打開新的事務。所以,在完成保護數(shù)據(jù)修改所需要的最后一個事務之后和再次需要一個事務來保護數(shù)據(jù)修改之前,應該關(guān)閉隱性事務。

SQLServer事務和并發(fā)控制課件8.3.2避免并發(fā)問題為了防止并發(fā)問題,應該小心地管理278.4事務處理實例分析

【例8-1】使用事務的三種模式進行表的處理,分批執(zhí)行,觀察執(zhí)行的過程。

USE教學管理GOSELECTtimes=0,*FROMstudent--檢查當前表中的結(jié)果GO--SQLServer首先處于自動事務管理模式INSERTstudent(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES('S060101','******19880510***','關(guān)漢青','男','','西安','計算機','信息學院')SELECTtimes=1,*FROMstudent--顯示'S060101'被插入。GOSQLServer事務和并發(fā)控制課件8.4事務處理實例分析【例8-1】使用事務的三種模式進28INSERTstudent(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES('S060101','******19880510***','關(guān)漢青','男','','西安','計算機','信息學院')--服務器:消息2627,級別14,狀態(tài)1,行1--違反了PRIMARYKEY約束'PK__Student__75A278F5'。不能在對象'Student'中插入重復鍵。--語句已終止。SELECTtimes=2,*FROMstudent--顯示數(shù)據(jù)沒有變化。GOBEGINTRANSACTION --進入顯式事務模式INSERTstudent(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES('S060106','******19880510***','關(guān)漢青','男','','西安','計算機','信息學院')SELECTtimes=3,*FROMstudent--顯示'S060106'被插入SQLServer事務和并發(fā)控制課件INSERTstudent(sno,sssn,sname,29ROLLBACKTRANSACTIONGOSELECTtimes=4,*FROMstudent--因為執(zhí)行了回滾,插入的'S060106'被撤消。GOSETIMPLICIT_TRANSACTIONSON--進入隱式事務模式INSERTstudent(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES('S060107','******19880510***','關(guān)漢青','男','','西安','計算機','信息學院')SELECTtimes=5,*FROMstudent--顯示'S060107'被插入ROLLBACK GOSELECTtimes=6,*FROMstudent--因為執(zhí)行了回滾,插入的'S060107'被撤消。GOSQLServer事務和并發(fā)控制課件ROLLBACKTRANSACTIONSQLServer30DELETEFROMstudentWHEREsno='S060101'--刪除第1個插入SELECTtimes=7,*FROMstudent--顯示'S060101'不存在ROLLBACKGO SELECTtimes=8,*FROMstudent--因為回滾,使刪除作廢,所以'S060101'又重新顯示存在。GOSETIMPLICIT_TRANSACTIONSOFF --隱式事務模式結(jié)束,又進入自動模式

DELETEFROMstudentWHEREsno='S060101'--刪除第1個插入SELECTtimes=9,*FROMstudent--自動模式執(zhí)行成功被自動提交,顯示'S060101'被刪除不存在。SQLServer事務和并發(fā)控制課件DELETEFROMstudentWHEREsno=31【例8-2】定義事務,使事務回滾到指定的保存點,分批執(zhí)行,觀察執(zhí)行的過程。

USE教學管理GOSELECTtimes=0,*FROMstudent--檢查當前表中的結(jié)果GOBEGINTRANSACTIONdemoINSERTstudent(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES('S060106','******19880510***','關(guān)漢青','男','','西安','計算機','信息學院')SAVETRANSACTIONsave_demoSQLServer事務和并發(fā)控制課件【例8-2】定義事務,使事務回滾到指定的保存點,分批執(zhí)行,觀32INSERTstudent(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES('S060107','******19890818***','楊理華','女','','運城','計算機','信息學院')SELECTtimes=1,*FROMstudent--顯示'S060106'和'S060107'都被插入。GOROLLBACKTRANSACTIONsave_demo--回滾部分事務SELECTtimes=2,*FROMstudent--顯示'S060107'被撤消不存在。GOROLLBACKTRANSACTION--回滾整個事務SELECTtimes=3,*FROMstudent--顯示'S060106'被撤消不存在。

SQLServer事務和并發(fā)控制課件INSERTstudent(sno,sssn,sname,33【例8-3】創(chuàng)建數(shù)據(jù)表stu_test3,生成三個級別的嵌套時務,并提交該嵌套事務。觀察變量@@TRANCOUNT的值的變化。

USE教學管理

--選擇數(shù)據(jù)庫必須單獨在一個批中GOSELECT@@TRANCOUNT--變量@@TRANCOUNT的值為0BEGINTRANSACTIONinside1SELECT@@TRANCOUNT--變量@@TRANCOUNT的值為1INSERTstudent(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES('S060106','******19880510***','關(guān)漢青','男','','西安','計算機','信息學院')GOBEGINTRANSACTIONinside2SELECT@@TRANCOUNT--變量@@TRANCOUNT的值為2

SQLServer事務和并發(fā)控制課件【例8-3】創(chuàng)建數(shù)據(jù)表stu_test3,生成三個級別的嵌套34INSERTstudent(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES('S060107','******19890818***','楊理華','女','','運城','計算機','信息學院')GOBEGINTRANSACTIONinside3SELECT@@TRANCOUNT--變量@@TRANCOUNT的值為3INSERTstudent(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES(‘S060108’,‘******19870818***’,‘陳向前’,‘男’,‘’,‘北京’,‘計算機’,‘信息學院’)GOCOMMITTRANSACTIONinside3SELECT@@TRANCOUNT--變量@@TRANCOUNT的值減為2GOSQLServer事務和并發(fā)控制課件INSERTstudent(sno,sssn,sname,35COMMITTRANSACTIONinside2SELECT@@TRANCOUNT--變量@@TRANCOUNT的值減為1GOCOMMITTRANSACTIONinside1SELECT@@TRANCOUNT--變量@@TRANCOUNT的值減為0GOSQLServer事務和并發(fā)控制課件COMMITTRANSACTIONinside236【例8-4】在教學管理數(shù)據(jù)的STUDENT表中先刪除一條記錄,然后再插入一條記錄,通過測試錯誤值確定提交還是回滾。

USE教學管理GODECLARE@del_errorint,@ins_errorint--開始一個事務BEGINTRAN--刪除一個學生DELETESTUDENTWHERESNO='S060308'--為刪除語句設(shè)置一個接受錯誤數(shù)值的變量SELECT@del_error=@@ERRORSQLServer事務和并發(fā)控制課件【例8-4】在教學管理數(shù)據(jù)的STUDENT表中先刪除一條記錄37--再執(zhí)行插入語句INSERTINTOSTUDENTVALUES('S060308','******19890526***','張丹寧','男','130***12','寧波','電子商務','信息學院',162)--為插入語句設(shè)置一個接受錯誤數(shù)值的變量SELECT@ins_error=@@ERROR--測試錯誤變量中的值IF@del_error=0AND@ins_error=0BEGIN

--成功,提交事務COMMITTRANENDSQLServer事務和并發(fā)控制課件--再執(zhí)行插入語句SQLServer事務和并發(fā)控制課件38ELSEBEGIN

--有錯誤發(fā)生,回滾事務

IF@del_error<>0PRINT'錯誤發(fā)生在刪除語句'IF@ins_error<>0PRINT'錯誤發(fā)生在插入語句'ROLLBACKTRANENDGO

可以將插入的‘S060308’改為‘SS060308’再執(zhí)行一次該程序,觀察結(jié)果有什么不同?

SQLServer事務和并發(fā)控制課件ELSESQLServer事務和并發(fā)控制課件398.5分布式事務

8.5.1分布式事務的兩階段提交

8.5.2分布式事務的處理過程

8.5.3分布式事務實例分析

SQLServer事務和并發(fā)控制課件8.5分布式事務8.5.1分布式事務的兩階段提交408.5分布式事務在大型應用領(lǐng)域,經(jīng)常需要時務跨服務器進行數(shù)據(jù)操作,這樣的事務被稱作分布式事務。所以分布式事務要能夠在多個服務器上執(zhí)行。按照關(guān)于分布式事務處理的X/OpenXA規(guī)范,分布式事務的處理過程規(guī)定為兩個階段,就是通常說的兩階段提交。為了簡化應用程序?qū)Ψ植际绞聞盏奶幚砉ぷ鳎到y(tǒng)提供了一個事務管理器來協(xié)調(diào)各個不同服務器對事務的處理操作,它就是MSDTC(DistributedTransactionCoordinator),既事務管理協(xié)調(diào)器。我們在第一章簡單介紹過。SQLServer事務和并發(fā)控制課件8.5分布式事務在大型應用領(lǐng)域,經(jīng)常需要時務跨服務器進行418.5.1分布式事務的兩階段提交(1)準備階段:當分布式事務管理器接受到提交請求后,它向所有參與與該事務的SQLServer服務器發(fā)出準備命令。每個服務器接受到準備命令后,做好接受處理事務的準備工作,并將準備工作狀態(tài)返回給事務管理器。(2)提交階段:當事務管理器接受到所有服務器成功準備好的信息后,它向這些服務器發(fā)出提交命令。之后所有服務器進行提交。如果所有服務器均能成功提交事務,管理器向應用程序報告分布式事務成功提交,如若有任一個服務器未能提交,事務管理器將向所有服務器發(fā)出回滾事務命令,并向應用程序報告事務提交失敗。SQLServer事務和并發(fā)控制課件8.5.1分布式事務的兩階段提交(1)準備階段:當分布式428.5.2分布式事務的處理過程(1)T-SQL程序或應用程序執(zhí)行BEGINDISTRIBUTEDTRANSACTION語句啟動一個分布式事務。此后,該服務器就成為分布式服務器的管理服務器。(2)應用程序?qū)︽溄臃掌鲌?zhí)行分布式查詢或執(zhí)行遠程服務器上的存儲過程。(3)分布式事務管理服務器自動調(diào)用MSDTC,使鏈接服務器或遠程服務器參加分布式事務處理。(4)T-SQL應用程序執(zhí)行COMMIT或ROLLBACK語句時,分布式事務管理服務器通過調(diào)用MSDTC來管理兩階段提交,使鏈接或遠程服務器提交或回滾事務。SQLServer事務和并發(fā)控制課件8.5.2分布式事務的處理過程(1)T-SQL程序或應用程438.5.3分布式事務實例分析

1.分布式事務語法格式語法格式:BEGINDISTRIBUTEDTRANSANCTION[transanctin_name|@transanctin_variable]參數(shù)說明:transanctin_name|@transanctin_variable事務名稱或事務名變量。

SQLServer事務和并發(fā)控制課件8.5.3分布式事務實例分析1.分布式事務語法格式SQ442、分布式事務實例【例8-6】有兩個服務器LinkServer1和LinkServer2。在LinkServer2服務器上建立存儲過程student_insert_new,其功能是向LinkServer1上的教學管理數(shù)據(jù)庫的student表插入一個新行。

--先創(chuàng)建鏈接(遠程)服務器(參見第2章)--在第一臺運行SQLServer的服務器上運行下列代碼:

EXECsp_addlinkedserver'LinkServer1','','SQLOLEDB','本地服務器名或ip地址'--例如'zufe-mxh'EXECsp_addlinkedserver'LinkServer2','','SQLOLEDB','遠程服務器名或ip地址'--例如'172.19.2.156'EXECsp_configure'remoteaccess',1--系統(tǒng)默認是1,一般不需要設(shè)置SQLServer事務和并發(fā)控制課件2、分布式事務實例【例8-6】有兩個服務器LinkServe45RECONFIGURE--設(shè)置'LinkServer1'的rpc輸出屬性,使得允許調(diào)用鏈接服務器上的存儲過程。EXECsp_serveroption'LinkServer1','rpcout','true'GO--停止并重新啟動第一臺SQLServer。--確保使用SQLServer身份驗證登錄。在第二臺SQLServer上運行下列代碼。EXECsp_addlinkedserver‘LinkServer2’,‘’,‘SQLOLEDB’,‘本地服務器名或ip地址’

--例如'172.19.2.156'EXECsp_addlinkedserver‘LinkServer1’,‘’,‘SQLOLEDB’,‘遠程服務器名或ip地址’

--例如'zufe-mxh'

SQLServer事務和并發(fā)控制課件RECONFIGURESQLServer事務和并發(fā)控制課件46EXECsp_configure'remoteaccess',1--系統(tǒng)默認是1,一般不需要設(shè)置RECONFIGURE--設(shè)置'LinkServer2'的rpc輸出屬性,使得允許調(diào)用鏈接服務器上的存儲過程。EXECsp_serveroption'LinkServer2','rpcout','true'GO--在第二個服務器上添加新的遠程登錄ID(LinkServer1),以便允許遠程服務器LinkServer1連接并執(zhí)行遠程過程調(diào)用。--假設(shè)登錄LinkServer2和LinkServer1的用戶都是'sa',并且有相同的口令。EXECsp_addremoteloginLinkServer1,sa,saGO--停止并重新啟動第二臺SQLServer。

SQLServer事務和并發(fā)控制課件EXECsp_configure'remoteacce47--在LinkServer2上創(chuàng)建存儲過程(見第12章)。--假設(shè)該服務器上面有數(shù)據(jù)庫‘教學練習’。Use教學練習GOCREATEprocedurestudent_insert_newASINSERTLinkServer1.教學管理.dbo.student(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES('S060112','******19870818***',''許少文','男','','湖州','計算機','信息學院')GO--在第一臺服務器上啟動DTC開始分布式事務--使用sa登錄,現(xiàn)在就可以在第一臺SQLServer上執(zhí)行第二臺SQLServer上的存儲過程。

SQLServer事務和并發(fā)控制課件--在LinkServer2上創(chuàng)建存儲過程(見第12章)。S48USE教學管理GOBEGINDISTRIBUTEDTRANSACTIONinsert_tran--開始分布式事務--在LinkServer1服務器上實行對表student的插入INSERTstudent(sno,sssn,sname,ssex,smtel,scity,smajor,sdepa)VALUES('S060111','******19870818***','陳東生','男','','上海','計算機','信息學院')GO--LinkServer1服務器自動調(diào)用MSDTC使得LinkServer2服務器執(zhí)行存儲過程student_insert_new對表student的插入。EXECUTELinkServer2.教學練習.dbo.student_insert_newCOMMITTRANSACTION--提交事務

SQLServer事務和并發(fā)控制課件USE教學管理SQLServer事務和并發(fā)控制課件498.6并發(fā)控制

8.6.1SQLServer鎖的粒度及模式

8.6.2封鎖協(xié)議

8.6.3事務隔離

8.6.4死鎖處理

SQLServer事務和并發(fā)控制課件8.6并發(fā)控制8.6.1SQLServer鎖的粒508.6并發(fā)控制在大型分布式數(shù)據(jù)庫應用程序中,對數(shù)據(jù)庫的并發(fā)訪問操作是一個普遍存在的問題。SQLServer使用資源鎖定的方法管理用戶的并發(fā)操作。SQLServer2000提供了兩種并發(fā)控制方法:▲樂觀并發(fā)控制:該方法假想用戶之間不太可能發(fā)生資源沖突(事實上不是不可能),所以允許用戶在不鎖定任何資源的情況下執(zhí)行事務。只有當用戶試圖修改數(shù)據(jù)時才檢查資源是否沖突。該方法需要使用游標,游標中介紹?!^并發(fā)控制:該方法根據(jù)需要在事務的持續(xù)時間內(nèi)鎖定資源,從而確保事務的完整性和數(shù)據(jù)庫的一致性。這是SQLServer2000默認的并發(fā)控制方法。下面予以介紹。SQLServer事務和并發(fā)控制課件8.6并發(fā)控制在大型分布式數(shù)據(jù)庫應用程序中,對數(shù)據(jù)庫的并發(fā)518.6.1SQLServer鎖的粒度及模式

1、SQLServer鎖的粒度1)RID:行標識符,鎖定表中單行數(shù)據(jù)。2)鍵值:具有索引的行數(shù)據(jù)。3)頁面:一個數(shù)據(jù)頁面或索引頁面。4)區(qū)域:一組連續(xù)的8個數(shù)據(jù)頁面或索引頁面。5)表:整個表,包括其所有的數(shù)據(jù)和索引。6)數(shù)據(jù)庫:一個完整的數(shù)據(jù)庫。可以根據(jù)事務所執(zhí)行的任務來靈活選擇所鎖定的資源粒度。SQLServer事務和并發(fā)控制課件8.6.1SQLServer鎖的粒度及模式1、SQL522、資源鎖定模式—基本鎖1)共享鎖:用于只讀數(shù)據(jù)操作,它允許多個并發(fā)事務對資源鎖定進行讀取,但禁止其他事務對鎖定資源的修改操作。2)排它鎖:它鎖定的資源不能被其它并發(fā)事務再進行任何鎖定,所以其它事務不能讀取和修改。鎖定的資源用于自己的數(shù)據(jù)修改。一般更新模式是由一個事務組成,該事務先讀取記錄,要獲取資源的共享鎖,然后修改記錄,此操作要求鎖轉(zhuǎn)換為排它鎖。如果兩個事務都獲得了資源上的共享鎖,然后試圖同時更新數(shù)據(jù),這樣肯定有一個事務要將共享鎖轉(zhuǎn)化為排它鎖,因為一個事務的排它鎖與其它事務的共享鎖不兼容,發(fā)生鎖等待。另一個事務也會出現(xiàn)這個問題,由于兩個事務都要轉(zhuǎn)化為排它鎖,并且都等待另一個事務釋放共享鎖,因此發(fā)生死鎖。SQLServer事務和并發(fā)控制課件2、資源鎖定模式—基本鎖1)共享鎖:用于只讀數(shù)據(jù)操作,它允許532、資源鎖定模式—專用鎖3)更新鎖:在修改操作的初始化階段用于鎖定可能被修改的資源。一個數(shù)據(jù)修改事務在開始時直接申請更新鎖,每次只有一個事務可以獲得資源的更新鎖。使用更新鎖可以避免上述死鎖,因為一次只有一個事務可以獲得更新鎖,之后當需要繼續(xù)修改數(shù)據(jù)時,將更新鎖轉(zhuǎn)換為排它鎖,否則將更新鎖轉(zhuǎn)換為共享鎖。SQLServer事務和并發(fā)控制課件2、資源鎖定模式—專用鎖3)更新鎖:在修改操作的初始化階段用544)意向鎖意向鎖表示如果獲得一個對象的鎖,說明該結(jié)點的下層對象正在被加鎖。例如放置在表上的共享意向鎖表示事務打算在表中的頁或行上加共享鎖。意向鎖可以提高性能,因為系統(tǒng)僅在表級上檢查意向鎖而無須檢查下層。①意向共享鎖:對一個對象加意向共享鎖,表示將要對它的下層對象加共享鎖。②意向排它鎖:對一個對象加意向排它鎖,表示將要對它的下層對象加排它鎖。③意向排它共享鎖:對一個對象加意向排它共享鎖,表示對它加共享鎖,再在它的下層對象加排它鎖。SQLServer事務和并發(fā)控制課件4)意向鎖意向鎖表示如果獲得一個對象的鎖,說明該結(jié)點的下層對555)架構(gòu)鎖①架構(gòu)修改鎖:執(zhí)行表的數(shù)據(jù)定義語言(DDL)操作時使用。②架構(gòu)穩(wěn)定鎖:編譯查詢時使用。它不阻塞任何事務鎖,包括排它鎖。6)大容量更新鎖:當數(shù)據(jù)大容量復制到表的時候使用。SQLServer事務和并發(fā)控制課件5)架構(gòu)鎖①架構(gòu)修改鎖:執(zhí)行表的數(shù)據(jù)定義語568.6.2封鎖協(xié)議

在運用X鎖和S鎖對數(shù)據(jù)對象加鎖時,需要約定一些規(guī)則:封鎖協(xié)議(LockingProtocol)何時申請X鎖或S鎖持鎖時間、何時釋放不同的封鎖協(xié)議,在不同的程度上為并發(fā)操作的正確調(diào)度提供一定的保證常用的封鎖協(xié)議:三級封鎖協(xié)議SQLServer事務和并發(fā)控制課件8.6.2封鎖協(xié)議在運用X鎖和S鎖對數(shù)據(jù)對象加鎖時,需571級封鎖協(xié)議事務T在修改數(shù)據(jù)R之前必須先對其加X鎖,直到事務結(jié)束才釋放正常結(jié)束(COMMIT)非正常結(jié)束(ROLLBACK)1級封鎖協(xié)議可防止丟失修改在1級封鎖協(xié)議中,如果是讀數(shù)據(jù),不需要加鎖的,所以它不能保證可重復讀和不讀“臟”數(shù)據(jù)。SQLServer事務和并發(fā)控制課件1級封鎖協(xié)議事務T在修改數(shù)據(jù)R之前必須先對其加X鎖,直到事務581級封鎖協(xié)議T1T2①

XlockA獲得②

讀A=16

③A←A-1寫回A=15CommitUnlockA④

XlockA等待等待等待等待獲得XlockA讀A=15A←A-1寫回A=14CommitUnlockA

沒有丟失修改沒有丟失修改SQLServer事務和并發(fā)控制課件1級封鎖協(xié)議T1T2①

XlockA

沒有丟失修改沒592級封鎖協(xié)議1級封鎖協(xié)議+事務T在讀取數(shù)據(jù)R前必須先加S鎖,讀完后即可釋放S鎖2級封鎖協(xié)議可以防止丟失修改和讀“臟”數(shù)據(jù)。在2級封鎖協(xié)議中,由于讀完數(shù)據(jù)后即可釋放S鎖,所以它不能保證可重復讀。SQLServer事務和并發(fā)控制課件2級封鎖協(xié)議1級封鎖協(xié)議+事務T在讀取數(shù)據(jù)R前必須先加S鎖,602級封鎖協(xié)議T1T2①

XlockC讀C=100C←C*2寫回C=200②

③ROLLBACK(C恢復為100)UnlockC④

SlockC等待等待等待等待獲得SlockC讀C=100CommitCUnlockC不讀“臟”數(shù)據(jù)

SQLServer事務和并發(fā)控制課件2級封鎖協(xié)議T1T2①XlockC不讀“臟”數(shù)據(jù)SQL613級封鎖協(xié)議1級封鎖協(xié)議+事務T在讀取數(shù)據(jù)R之前必須先對其加S鎖,直到事務結(jié)束才釋放3級封鎖協(xié)議可防止丟失修改、讀臟數(shù)據(jù)和不可重復讀。容易造成比較多的死鎖SQLServer事務和并發(fā)控制課件3級封鎖協(xié)議1級封鎖協(xié)議+事務T在讀取數(shù)據(jù)R之前必須先對623級封鎖協(xié)議T1T2①

SlockA讀A=50SlockB讀B=100求和=150②

③讀A=50讀B=100求和=150CommitUnlockAUnlockB④

XlockB等待等待等待等待等待等待等待等待獲得XlockB讀B=100B←B*2寫回B=200CommitUnlockB

可重復讀

SQLServer事務和并發(fā)控制課件3級封鎖協(xié)議T1T2①

SlockA

可重復讀SQL63封鎖協(xié)議小結(jié)SQLServer事務和并發(fā)控制課件封鎖協(xié)議小結(jié)SQLServer事務和并發(fā)控制課件648.6.3事務隔離

為了避免產(chǎn)生并發(fā)訪問問題,SQLServer使用不同類型的鎖對資源進行鎖定,從而限制在一個事務讀取數(shù)據(jù)期間其他事務鎖執(zhí)行的操作類型,即對事務進行隔離。不同的并發(fā)訪問問題可以通過設(shè)置不同的事務隔離級別加以解決。事務的隔離級別控制一個事務與其他事務的隔離程度,它決定該事務在讀取數(shù)據(jù)時對資源所使用的鎖類型。SQLServer事務和并發(fā)控制課件8.6.3事務隔離為了避免產(chǎn)生并發(fā)訪問問題,SQLS651)事務隔離級別未提交讀:這是4種隔離級別中限制最低的級別,它僅能保證SQLServer不讀取物理損壞的數(shù)據(jù)。在這種隔離級別下,讀數(shù)據(jù)時不發(fā)出共享鎖,也不接受排它鎖,事務可以對數(shù)據(jù)執(zhí)行臟讀;在事務結(jié)束前可以更改數(shù)據(jù)集內(nèi)的數(shù)值,行也可以出現(xiàn)在數(shù)據(jù)集中或從數(shù)據(jù)集消失。但可以防止產(chǎn)生丟失修改。(一級封鎖協(xié)議)提交讀:它要求在讀取數(shù)據(jù)時控制共享鎖以避免發(fā)生臟讀,但數(shù)據(jù)可在事務結(jié)束前更改,這可能產(chǎn)生不能重復讀或幻影讀問題。(二級封鎖協(xié)議)可重復讀:鎖定查詢中使用的所有數(shù)據(jù)以防止其他用戶更新,但是其他用戶可以將新的幻影行插入到數(shù)據(jù)集中,新插入的幻影行將出現(xiàn)在當前事物的后續(xù)讀取結(jié)果集中。可重復讀能夠避免產(chǎn)生臟讀和非重復讀問題,但仍可能導致幻影讀問題。(三級封鎖協(xié)議)可串行讀:這是事務隔離的最高級別,它使事務之間完全隔離,所以將導致并發(fā)級別較低。在這種隔離級別下,SQLServer在數(shù)據(jù)集上放置一個范圍鎖,以防止其他用戶在事務完成之前更新數(shù)據(jù)集或向數(shù)據(jù)集內(nèi)插入數(shù)據(jù)行,從而避免出現(xiàn)臟讀、非重復讀或幻影讀等并發(fā)問題。(四級封鎖協(xié)議)SQLServer事務和并發(fā)控制課件1)事務隔離級別SQLServer事務和并發(fā)控制課件662)事務隔離級別對不同類型的行為隔離級別丟失修改臟數(shù)據(jù)不可重讀幻影未提交讀否是是是提交讀否否是是可重復讀否否否是可串行讀否否否否SQLServer事務和并發(fā)控制課件2)事務隔離級別對不同類型的行為隔離級別673)設(shè)置事務隔離級別調(diào)用T-SQL中的SETTRANSACTIONINOLATIONLEVEL語句可以調(diào)整事務的隔離級別,以控制由該連接所發(fā)出的所有SELECT語句的默認事務鎖定行為。該語句的語法格式為:SETTRANSACTIONISOLATIONLEVEL{READUNCOMMITTED|READCOMMITTED|REPEATABLEREAD|SERIALIZABLE}例如:將事務隔離級別設(shè)置為REPEATABLEREADSETTRANSACTIONISOLATIONLEVELREPEATABLEREAD注意:一旦設(shè)定,系統(tǒng)就會按這種隔離級別自動進行并發(fā)處理。SQLServer事務和并發(fā)控制課件3)設(shè)置事務隔離級別調(diào)用T-SQL中的SET68設(shè)置表級鎖表級鎖是由程序員進行的,可以對SELECT、INSERT、UPDATE、DELETE語句進行精確控制。表級鎖定不是系統(tǒng)自動完成,而是需要程序員自己根據(jù)事務的要求進行鎖定,然后,系統(tǒng)按程序員在程序中的鎖定予以執(zhí)行。一般來說,讀操作需要共享鎖,寫操作需要排它鎖。如果需要更精確,還需要一些其它專用鎖。具體設(shè)置有:設(shè)置共享鎖設(shè)置排它鎖設(shè)置專用鎖SQLServer事務和并發(fā)控制課件設(shè)置表級鎖表級鎖是由程序員進行的,可以對SELE69設(shè)置共享鎖共享鎖用于讀操作。一個資源可獲得多個共享鎖。使用HOLDLOCK設(shè)置共享鎖。例:USENorthwindGOBEGINTRANSANCTIONT1SELECTOrderID,OrderDateFROMOrdersWITH(HOLDLOCK)SELECTCOUNT(OrderID)FROMOrdersCOMMITSQLServer事務和并發(fā)控制課件設(shè)置共享鎖共享鎖用于讀操作。一個資源可獲得70設(shè)置排它鎖對于INSERT、UPDATE和DELETE語句使用排它鎖。在并發(fā)事務中,只有一個事務能夠獲得資源的排它鎖。使用TABLOCKX設(shè)置排它鎖。例:USENorthwindGOBEGINTRANSANCTIONT1INSERTINTOOrdersWITH(TABLOCKX)(CustomerID,OrderDate)VALUES(‘ALEF’,’2005-01-01’)COMMITSQLServer事務和并發(fā)控制課件設(shè)置排它鎖對于INSERT、UPDATE和DELETE71設(shè)置其它專用鎖方法同上。NOLOCK:不要發(fā)出共享鎖和排它鎖。僅適用SELECT語句。READPAST:跳過已經(jīng)鎖定的行。僅適用SELECT語句。TABLOCK:使用大容量更新鎖。PAGLOCK:使用頁級鎖。ROWLOCK:使用行級鎖,不使用頁級和表級鎖。UPDLOCK:讀取表時使用更新鎖。XLOCK:適用于不同粒度的排它鎖。SQLServer事務和并發(fā)控制課件設(shè)置其它專用鎖方法同上。SQLServer事務和728.6.4死鎖處理

SQLServer能夠自動定期搜索和處理死鎖問題。當檢測到有死鎖時,SQLServer回滾被中斷的事務,并向應用程序返回1205號錯誤信息,未被中斷的事務則繼續(xù)執(zhí)行。在數(shù)據(jù)庫應用程序撲捉到1205號錯誤,可以對死鎖現(xiàn)象做后續(xù)處理。為減少死鎖次數(shù),在設(shè)計應用程序時:1)盡量使一個事務在一個批內(nèi),并且要短;2)不要在事務處理期間和用戶交互;3)靈活使用較低級別的事務隔離;4)在事務處理期間要使訪問數(shù)據(jù)量最小。SQLServer事務和并發(fā)控制課件8.6.4死鎖處理SQLServer能夠自動定期搜索73Thankyouverymuch!謝謝您的光臨!下一章SQLServer事務和并發(fā)控制課件Thankyouverymuch!謝謝您的光臨!下一章74大型數(shù)據(jù)庫系統(tǒng)管理、設(shè)計與實例分析

——基于SQLServer

SQLServer事務和并發(fā)控制課件大型數(shù)據(jù)庫系統(tǒng)管理、設(shè)計與實例分析

——基于SQLServ75第8章SQLServer事務和并發(fā)控制8.1事務8.2事務的分類和控制8.3并發(fā)控制8.4事務處理實例分析

8.5分布式事務8.6并發(fā)控制

SQLServer事務和并發(fā)控制課件第8章SQLServer事務和并發(fā)控制8.1768.1事務8.1.1事務的概念8.1.2事務對并發(fā)控制和保障數(shù)據(jù)完整的重要性SQLServer事務和并發(fā)控制課件8.1事務8.1.1事務的概念SQLServer事778.1.1事務的概念事務是一個用戶定義的完整的工作單元,一個事務內(nèi)的所有語句被作為整體執(zhí)行,要么全部執(zhí)行,要么全部不執(zhí)行。遇到錯誤時,可以回滾事務,取消事務內(nèi)所做的所有改變,從而保證數(shù)據(jù)庫中數(shù)據(jù)的一致性和可恢復性。SQLServer事務和并發(fā)控制課件8.1.1事務的概念事務是一個用戶定義的完整的工作單元,781、事務的特性(ACID)原子性(Atomicity):事務是數(shù)據(jù)庫的邏輯工作單位,事務中的操作要么都做,要么都不做。

一致性(Consistency):事務執(zhí)行的結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變到另一個一致性狀態(tài)。隔離性(Isolation):一事務的執(zhí)行不能被其它事務干擾。持續(xù)性(永久性)(Durability):指事務一旦提交,則其對數(shù)據(jù)庫中數(shù)據(jù)的改變就應該是永久的

SQLServer事務和并發(fā)控制課件1、事務的特性(ACID)原子性(Atomicity):事務792、事務和批的區(qū)別編程時,一定要區(qū)分事務和批的差別:批是一組整體編譯的SQL語句,事務是一組作為單個邏輯工作單元執(zhí)行的SQL語句。批語句的組合發(fā)生在編譯時刻,事務中語句的組合發(fā)生在執(zhí)行時刻。當在編譯時,批中某個語句存在語法錯誤,系統(tǒng)將取消整個批中所有語句執(zhí)行,而在運行時刻,如果事務中某個數(shù)據(jù)修改違反約束、規(guī)則等,系統(tǒng)默認只回退到產(chǎn)生該錯誤的語句。如果批中產(chǎn)生一個運行時錯誤,系統(tǒng)默認只回退到產(chǎn)生該錯誤的語句。但當打開XACT_ABORT選項為ON時,可以系統(tǒng)自動回滾產(chǎn)生該錯誤的當前事務。一個事務中也可以擁有多個批,一個批里可以有多個SQL語句組成的事務,事務內(nèi)批的多少不影響事務的提交或回滾操作。SQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別編程時,一定要區(qū)分事務和批的差別:SQLS802、事務和批的區(qū)別SETXACT_ABORT指定當Transact-SQL語句產(chǎn)生運行時錯誤時,Microsoft?SQLServer?是否自動回滾當前事務。語法SETXACT_ABORT{ON|OFF}當SETXACT_ABORT為ON時,如果Transact-SQL語句產(chǎn)生運行時錯誤,整個事務將終止并回滾。為OFF時,只回滾產(chǎn)生錯誤的Transact-SQL語句,而事務將繼續(xù)進行處理。編譯錯誤(如語法錯誤)不受SETXACT_ABORT的影響。對于大多數(shù)OLEDB提供程序(包括SQLServer),隱性或顯式事務中的數(shù)據(jù)修改語句必須將XACT_ABORT設(shè)置為ON。唯一不需要該選項的情況是提供程序支持嵌套事務時。SQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別SETXACT_ABORTSQLServ812、事務和批的區(qū)別下例導致在含有其它Transact-SQL語句的事務中發(fā)生違反外鍵錯誤。在第一個語句集中產(chǎn)生錯誤,但其它語句均成功執(zhí)行且事務成功提交。在第二個語句集中,SETXACT_ABORT設(shè)置為ON。這導致語句錯誤使批處理終止,并使事務回滾。CREATETABLEt1(aintPRIMARYKEY)CREATETABLEt2(aintREFERENCESt1(a))GOINSERTINTOt1VALUES(1)INSERTINTOt1VALUES(3)INSERTINTOt1VALUES(4)INSERTINTOt1VALUES(6)GOSETXACT_ABORTOFFGOBEGINTRANINSERTINTOt2VALUES(1)INSERTINTOt2VALUES(2)/*Foreignkeyerror*/INSERTINTOt2VALUES(3)COMMITTRANGOSQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別下例導致在含有其它Transact-SQ822、事務和批的區(qū)別SETXACT_ABORTONGOBEGINTRANINSERTINTOt2VALUES(4)INSERTINTOt2VALUES(5)/*Foreignkeyerror*/INSERTINTOt2VALUES(6)COMMITTRANGO/*Selectshowsonlykeys1and3added.Key2insertfailedandwasrolledback,butXACT_ABORTwasOFFandrestoftransactionsucceeded.Key5inserterrorwithXACT_ABORTONcausedallofthesecondtransactiontorollback.*/SELECT*FROMt2GODROPTABLEt2DROPTABLEt1GOSQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別SETXACT_ABORTONSQLS832、事務和批的區(qū)別問題:如何知道XACT_ABORT為ON還是OFF呢?XACT_ABORT的默認值是什么?SQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別問題:如何知道XACT_ABORT為ON還842、事務和批的區(qū)別問題:如何知道XACT_ABORT為ON還是OFF呢?DBCCUSEROPTIONS:itwillshowassetifit'sON.Ifit'sOFFthenitwillnotshow

DBCCUSEROPTIONS返回當前連接的活動(設(shè)置)的SET選項??纯碫B的例子:運行DBCC(順便看一下聯(lián)機幫助文檔)并查看結(jié)果SQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別問題:如何知道XACT_ABORT為ON還852、事務和批的區(qū)別SETXACT_ABORT的默認值是什么?對每個連接來說,SETXACT_ABORT的默認值是OFF看看VB的例子和查詢分析器SQLServer事務和并發(fā)控制課件2、事務和批的區(qū)別SETXACT_ABORT的默認值是什么868.1.2事務對并發(fā)控制和保障

數(shù)據(jù)完整的重要性1.事務與并發(fā)控制的關(guān)系如果在用戶并發(fā)訪問期間沒有保證多個事務正確的交叉運行,用戶操作相同的數(shù)據(jù)時可能會產(chǎn)生一些意想不到的問題。包括:(1)丟失修改或被覆蓋(火車票)(2)讀臟數(shù)據(jù)(銀行利息)(3)不能重復讀(學生成績)(4)幻影讀SQLServer事務和并發(fā)控制課件8.1.2事務對并發(fā)控制和保障

數(shù)據(jù)完整的重要性1.事872.事務對保障數(shù)據(jù)一致和完整性的作用故障輕則造成運行事務非正常中斷,影響數(shù)據(jù)庫中數(shù)據(jù)的正確性,重則破壞數(shù)據(jù)庫,使數(shù)據(jù)庫中全部或部分數(shù)據(jù)丟失。影響事務正常運行的故障有:(1)事務內(nèi)部的故障(2)系統(tǒng)故障(3)介質(zhì)故障(4)計算機病毒8.1.2事務對并發(fā)控制和保障

數(shù)據(jù)完整的重要性SQLServer事務和并發(fā)控制課件2.事務對保障數(shù)據(jù)一致和完整性的作用8.1.2事務對并888.2事務的分類和控制8.2.1事務的分類8.2.2事務控制SQLServer事務和并發(fā)控制課件8.2事務的分類和控制8.2.1事務的分類SQL898.2.1事務的分類SQLServer的事務模式可分為顯式事務、隱式事務和自動事務三種。1)顯式事務顯式事務是指由用戶執(zhí)行T-sql事務語句而定義的事務,這類事務又稱做用戶定義事務。定義事務的語句包括:BEGINTRANSACTION:標識一個事務的開始,即啟動事務。COMMITTRANSACTION、COMMITWORK:標識一個事務的結(jié)束,事務內(nèi)所修改的數(shù)據(jù)被永久保存到數(shù)據(jù)庫中。ROLLBACKTRANSACTION、ROLLBACKWORK:標識一個事務的結(jié)束,說明事務執(zhí)行過程中遇到錯誤,事務內(nèi)所修改的數(shù)據(jù)被回滾到事務執(zhí)行前的狀態(tài)。SQLServer事務和并發(fā)控制課件8.2.1事務的分類SQLServer的事務

溫馨提示

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

評論

0/150

提交評論