資料結(jié)構(gòu)_課程_第1頁(yè)
已閱讀1頁(yè),還剩86頁(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)介

1、第 十 章交易管理,課程名稱:資料庫(kù)系統(tǒng)授課老師:李春雄 博士,本章學(xué)習(xí)目標(biāo),1.讓讀者瞭解交易處理的流程及四大特性(ACID)。2.讓讀者瞭解並行控制(Concurrency Control)的技 術(shù)及交易的隔離等級(jí)。,本章內(nèi)容,10-1 何謂交易處理10-2 交易的進(jìn)行模式10-3 巢狀交易(Nested Transaction)10-4 設(shè)定交易儲(chǔ)存點(diǎn)10-5 交易的隔離等級(jí)10-6 並行控制的

2、必要性,10-1 何謂交易處理,【定義】交易(Transaction)乃是一連串不可分割的資料庫(kù)操作指令的集合。當(dāng)交易裡的每一個(gè)操作指令都成功時(shí),該筆交易才算成功,否則交易就算失敗,必須恢復(fù)到交易前的資料狀態(tài)?!窘灰滋幚淼睦印课覀兿肟纯淬y行金錢(qián)往來(lái)的情況。假設(shè)有一位客戶從A銀行轉(zhuǎn)帳至B銀行,要做的動(dòng)作為從A銀行的帳戶扣款、B銀行的帳戶加上轉(zhuǎn)帳的金額,兩個(gè)動(dòng)作必須同時(shí)成功,只要有任何一個(gè)動(dòng)作失敗,則此次轉(zhuǎn)帳失敗。如圖10-1所示。

3、,【交易程序圖】,在圖10-1中,要完成一個(gè)交易必須要經(jīng)過(guò)四個(gè)步驟,若萬(wàn)一在進(jìn)行步驟4之前,銀行的資訊系統(tǒng)主機(jī)之電源中斷,或是發(fā)現(xiàn)到B銀行的帳戶不存在時(shí),那要怎麼辦呢?這樣的話,在步驟2時(shí)提出來(lái)的2000元已經(jīng)不在A銀行的帳戶了,也不在B銀行的帳戶,那2000走去那裡呢?該不會(huì)銀行多賺了2000元吧!,為了不讓這樣的情況發(fā)生,我們可以使用交易處理來(lái)把一些對(duì)於資料庫(kù)的操作(A銀行扣掉2000元與B銀行存入2000元)視為同一個(gè)交易動(dòng)作。因

4、此,當(dāng)交易裡的每一個(gè)操作指令都成功時(shí),該筆交易才算成功,否則交易就算失敗,必須恢復(fù)到交易前的資料狀態(tài)。因此,在步驟2被扣掉的2000元,會(huì)因?yàn)榻灰资《詣?dòng)被恢復(fù)到交易前的資料狀態(tài)。,【交易程序圖】,我們可以撰寫(xiě)下列的演算法來(lái)了解整個(gè)交易的過(guò)程:,由以上的演算法,我們大略可以得知,在資料庫(kù)中的交易要有三個(gè)基本的命令:BeginTransaction、Commit和Rollback。BeginTransaction標(biāo)示交易的開(kāi)始。發(fā)生在B

5、eginTransaction和下一個(gè)命令(不是Rollback就是Commit)之間的任何事物會(huì)被視為交易的一部份。如圖10-2交易流程圖所示。,10-1.1 交易管理的四大特性,【交易目的】主要維持資料之間的以下四個(gè)目的1. 一致性(Consistency)2.完整性(Completeness)3.正確性(Correctness)4.並行控制(Concurrency)而交易進(jìn)行時(shí),如何達(dá)到以上的目的,其最主要原因就是交易管

6、理具有四個(gè)特性(ACID)?!窘灰姿拇筇匦浴恳?、單元性(Atomicity)二、一致性(Consistency)三、隔離性(Isolation)四、持久性(Durability),一、不可分割性(Atomicity),【定義】將交易過(guò)程的所有對(duì)資料庫(kù)操作視為同一個(gè)單元工作,其中可能包括許多步驟,這些步驟要嘛全部執(zhí)行成功,否則,整個(gè)交易宣告失敗。所以,整個(gè)交易是一個(gè)不可分割的邏輯單位。,【舉例】,假設(shè)現(xiàn)在有兩個(gè)交易,分別為T(mén)1

7、與T2,時(shí)間由t1~t6,實(shí)際交易過(guò)程如下所示:,因此,如果在交易t4時(shí)間Read (B)的讀取操作發(fā)生錯(cuò)誤,交易管理需要避免t3時(shí)間所Write(A)的資料庫(kù)寫(xiě)入操作,並不會(huì)真正寫(xiě)入資料庫(kù),因?yàn)橘Y料庫(kù)單元操作沒(méi)有全部執(zhí)行,就都不能執(zhí)行。,1.發(fā)生錯(cuò)誤,整個(gè)交易視為不可分割的單位,2.不會(huì)真正寫(xiě)入資料庫(kù),延伸學(xué)習(xí):,資料庫(kù)的單元工作是由許多步驟所組成,而每一步驟就是每一句SQL命令的執(zhí)行。其基本的架構(gòu)如下:,說(shuō)明

8、:以上的交易操作(SQL命令1,SQL命令2,…,SQL命令N),只要其中之一個(gè)SQL命令 產(chǎn)生錯(cuò)誤時(shí),將會(huì)導(dǎo)到整個(gè)交易失敗,並且執(zhí)行Rollback Transaction。,二、一致性(Consistency),【定義】指交易過(guò)程所異動(dòng)的資料在交易前與交易後必須一致,資料庫(kù)的資料必須仍然滿足完整性限制條件(利用資料表中的Check與Foreign Key),即維持資料的一致性,如圖10-4所示:因

9、為,DBMS需要維持資料庫(kù)資料的一致性,同樣的,交易管理也必須要維持一致性。,,【舉例】,假設(shè)「張三」客戶欲從A銀行轉(zhuǎn)入2000元到B銀行,交易前「張三」在A銀行和B銀行的總和是15,000元,在交易完成後,A銀行和B銀行的總和必須還是15,000元,因此,在交易前後的帳戶總額是相同的。如下表所示:,三、隔離性(Isolation),【定義】隔離性是指多筆交易在同時(shí)交易時(shí),雖然各交易是並行執(zhí)行,不過(guò)各交易之間應(yīng)該滿足獨(dú)立性,也就是說(shuō),一

10、個(gè)交易不會(huì)影響到其它交易的執(zhí)行結(jié)果,或被其它交易所干擾。,【舉例】,假設(shè)現(xiàn)在有兩個(gè)交易,分別為T(mén)1與T2,時(shí)間由t1~t5,實(shí)際交易過(guò)程如下所示:假設(shè):A的預(yù)設(shè)值=10說(shuō)明:當(dāng)交易T1在時(shí)間t1時(shí),會(huì)讀取A的預(yù)設(shè)值10,並且在t2時(shí)間將10改為20,而交易T2在時(shí)間t4讀取A值,結(jié)果交易T1在時(shí)間t5時(shí)Abort(撤回),形成交易T2所讀取的資料是不正確的,也必須要被Abort(撤回)。,,不正確(Dirty Read

11、),【分析】交易T1的資料更新到一半尚未完成確認(rèn)(Commit)時(shí),卻被 交易T2來(lái)讀取,因此,交易T2只是取得交易T1的暫時(shí)性資 料,此現(xiàn)象就稱為Dirty Read。【解決方法】利用鎖定(Lock)資料的方式來(lái)隔離交易。,,四、持久性(Durability),【定義】永久性是指當(dāng)交易完成執(zhí)行確認(rèn)交易(Commit)後,資料庫(kù)會(huì)保存交易後的結(jié)果,即使系統(tǒng)掛了,交易的結(jié)

12、果也不能遺失。如下圖所示:,,【兩種機(jī)制與ACID分析】,資料庫(kù)系統(tǒng)的交易管理是指「並行控制」和「回復(fù)技術(shù)」兩個(gè)機(jī)制的合稱,因此,我們可以將兩種機(jī)制與ACID分析如下:(1)「並行控制」機(jī)制是要維持「隔離性」和「一致性」保持(2)「回復(fù)技術(shù)」機(jī)制是維持交易處理的「不可分割性」和「永久性」,10-1.2 交易的狀態(tài)與進(jìn)行,一、交易的狀態(tài) 一個(gè)交易狀態(tài)是由活動(dòng)狀態(tài)(Active)、部分確認(rèn)(Partially Committed)、

13、確認(rèn)(Committed)、失敗(Failed)及終止?fàn)顟B(tài)(Terminated)等五個(gè)狀態(tài)組合而成。如圖10-6交易狀態(tài)轉(zhuǎn)換圖如下所示:,1.活動(dòng)狀態(tài)(Active State),【定義】當(dāng)「交易開(kāi)始(Begin Transaction)」執(zhí)行時(shí)即進(jìn)入「活動(dòng)狀態(tài)(Active State)」,在此狀態(tài)中可以對(duì)資料庫(kù)進(jìn)行一系列的讀(Read)及寫(xiě)(Write)動(dòng)作。,【舉例】網(wǎng)路銀行轉(zhuǎn)帳的例子,假設(shè)某一位家長(zhǎng)欲轉(zhuǎn)帳2000元給就讀

14、遠(yuǎn)方學(xué)校的兒子生活費(fèi)用,因此,他必須要在ATM進(jìn)行以下的操作動(dòng)作:步驟一:上網(wǎng)連到指定的網(wǎng)路銀行之網(wǎng)站步驟二:輸入「身份證字號(hào)/統(tǒng)一編號(hào)/客戶編號(hào)」 輸入「使用者名稱」 輸入「簽入密碼」,後再按「登入」 系統(tǒng)會(huì)自動(dòng)檢查是否正確。如果正確時(shí),則再進(jìn)行以下的步驟。步驟三:查詢目前的帳戶餘額步驟四:轉(zhuǎn)帳的操作動(dòng)作……以上步驟三與步

15、驟四就是所謂的「活動(dòng)狀態(tài)(Active State)」。,2.部分確認(rèn)狀態(tài) (Partially Committed State),【定義】指在對(duì)資料庫(kù)進(jìn)行各種單元操作完成之後,也就是交易結(jié)束。此時(shí)即可進(jìn)入「部分確認(rèn)狀態(tài)(Partially Committed State)」,在此狀態(tài)中「同步控制」動(dòng)作將會(huì)去檢查是否干擾其他正在執(zhí)行中的交易。,【舉例】網(wǎng)路銀行轉(zhuǎn)帳的例子,步驟五:匯款的操作動(dòng)作……完成之後,將會(huì)出現(xiàn)如下的

16、畫(huà)面:=======================================請(qǐng)?jiān)俅_認(rèn)轉(zhuǎn)帳資訊轉(zhuǎn)出帳號(hào):A123456789 轉(zhuǎn)入帳號(hào):B123456789 轉(zhuǎn)帳金額 新臺(tái)幣2,000元請(qǐng)您再確認(rèn)以上的轉(zhuǎn)帳資訊是否確正?「確認(rèn)」「消取」=======================================以上步驟就是所謂的「部分確認(rèn)狀態(tài)(Partially Committed State) 」。,3.確

17、認(rèn)狀態(tài)(Committed State),【定義】當(dāng)「活動(dòng)狀態(tài)」與「部分確認(rèn)狀態(tài)」檢查動(dòng)作都成功之後,即可進(jìn)入「確認(rèn)狀態(tài)(Committed State)」,亦即將交易過(guò)程真正的寫(xiě)入資料庫(kù)中,表示此筆交易成功。,【舉例】網(wǎng)路銀行轉(zhuǎn)帳的例子,步驟六:在您按「確認(rèn)」交易動(dòng)作之後,將會(huì)出現(xiàn)如下的畫(huà)面:=======================================

18、 轉(zhuǎn)帳成功交易時(shí)間: 2010/10/18 17:44:24跨行序號(hào): 9896877轉(zhuǎn)出帳號(hào):A123456789 轉(zhuǎn)入帳號(hào):B123456789 轉(zhuǎn)帳金額:新臺(tái)幣2,000元轉(zhuǎn)帳手續(xù):費(fèi) 新臺(tái)幣12元 交易備註:家長(zhǎng)轉(zhuǎn)帳2000元給就讀遠(yuǎn)方學(xué)校的兒子=======================================以上步驟就是所謂的「確認(rèn)狀態(tài)(Committed Stat

19、e) 」。,4.失敗狀態(tài)(Failed State),【定義】當(dāng)「活動(dòng)狀態(tài)」或「部分確認(rèn)狀態(tài)」檢查動(dòng)作其中一項(xiàng)失敗時(shí),此時(shí)會(huì)被要求進(jìn)入「失敗狀態(tài)」,在此狀態(tài)中交易將會(huì)寫(xiě)入「UNDO取消」動(dòng)作,以回復(fù)到交易未執(zhí)行前的狀態(tài)。,5.終止?fàn)顟B(tài)(Terminated State),【定義】是指在「交易失敗」或「交易成功」之後,最後都必須執(zhí)行交易終止,亦即結(jié)束交易(End Transaction)。由圖10-6中,若要結(jié)束交易功能

20、的話,有兩種情況:下達(dá)確認(rèn)(Commit)或撤回(Rollback)指令這兩種情況才會(huì)使交易結(jié)束。因此,如果在交易處理當(dāng)中,若執(zhí)行的操作有成功的話,可以使用確認(rèn)(Committed)指令。執(zhí)行確認(rèn)指令之後,交易功能的處理結(jié)果就會(huì)真正被反映出來(lái)。如果在交易處理當(dāng)中,若執(zhí)行的操作失敗時(shí),或想要重新再來(lái)一次的話,可以執(zhí)行撤回(Rollback)指令。執(zhí)行撤回指令之後,原來(lái)的交易操作會(huì)變成無(wú)效,資料會(huì)回到原本執(zhí)行處理之前的狀態(tài)。,二、交易的

21、進(jìn)行,【定義】一個(gè)完整且成功的交易,必須要經(jīng)過(guò)一連串的交易動(dòng)作,因此,我們必須要了解每一個(gè)交易動(dòng)作的目的。如下所示:1.BEGIN TRANSACTION(又可寫(xiě)成BEGIN TRAN)2.READ或WRITE3.同步控制動(dòng)作檢查4.COMMIT TRANSACTION (又可寫(xiě)成COMMIT TRAN、COMMIT或COMMIT WORK) 5.ROLLBACK TRANSACTION (

22、又可寫(xiě)成ROLLBACK TRAN, ROLLBACK 或ROLLBACK WORK) 6.UNDO 7.REDO,1. BEGIN TRANSACTION,它又可寫(xiě)成BEGIN TRAN【定義】 表示開(kāi)始執(zhí)行交易。如果交易成功,就使用確認(rèn)交易COMMIT TRAN指令結(jié)束。【格式】 但是,如果交易失敗,回復(fù)交易是使用ROLLBACK TRAN指令結(jié)束?!靖袷健?2.READ或WRITE,

23、【定義】 表示對(duì)資料庫(kù)進(jìn)行讀寫(xiě)動(dòng)作?!九e例】 新增(寫(xiě)入動(dòng)作)一筆記錄到「學(xué)生資料表」中,3.同步控制動(dòng)作檢查,【定義】對(duì)資料庫(kù)的各種操作完成之後,即可進(jìn)入部分確認(rèn)狀態(tài),並且準(zhǔn)備進(jìn)入Commit,在此某些同步控制動(dòng)作將檢查其是否干擾其他正在執(zhí)行中的交易,同時(shí)也會(huì)有某些復(fù)原協(xié)定會(huì)去檢查。註:在 Transaction 中的每一項(xiàng)操作結(jié)束後都必須檢查 @@ERROR, 如果有錯(cuò)誤產(chǎn)生時(shí),

24、則@@ERROR就不等於0,4.COMMIT TRANSACTION,它又可寫(xiě)成COMMIT TRAN、COMMIT或COMMIT WORK 【定義】確認(rèn)交易(Commit):如果交易執(zhí)行過(guò)程沒(méi)有錯(cuò)誤,下達(dá)COMMIT指令,將交易更改的資料實(shí)際寫(xiě)入資料庫(kù),以便執(zhí)行下一個(gè)交易,如下所示:在確認(rèn)交易成功之後,並且保證交易的資料更新一定會(huì)反應(yīng)到資料庫(kù)中,因此,其對(duì)資料庫(kù)所作的改變會(huì)被確認(rèn),而不會(huì)被UNDO掉。,5.R

25、OLLBACK TRANSACTION,它又可寫(xiě)成ROLLBACK TRAN, ROLLBACK 或ROLLBACK WORK 【定義】回復(fù)交易(Rollback):如果交易執(zhí)行過(guò)程有錯(cuò)誤,就是下達(dá)ROLLBACK指令放棄交易,並將資料庫(kù)回復(fù)到交易前狀態(tài),如下所示:,6.UNDO,【定義】與ROLL BACK動(dòng)作相似,但是只會(huì)被用來(lái)回復(fù)到未進(jìn)行單一動(dòng)作前的狀態(tài),而不是整個(gè)交易。,7.REDO,【定義】這是要重複執(zhí)行某一交

26、易中的動(dòng)作,以確定所有已被確認(rèn)的交易動(dòng)作已經(jīng)成功的作用在資料庫(kù)中。,【範(fàn)例一】,確認(rèn)對(duì)資料庫(kù)所做的交易,【範(fàn)例二】,回復(fù)對(duì)資料庫(kù)所做的交易,【實(shí)作】,假設(shè)有A,B兩家銀行,其存款客戶資料及存款如下:(一)「匯款前」之後的A銀行與B銀行之客戶存款資料 A銀行客戶存款表 B銀行客戶存款表,(二)「匯款後(成功)」A銀行與B銀行之客戶存款資料A銀行客戶存款表

27、 B銀行客戶存款表現(xiàn)在A銀行的「張三」客戶欲匯款2000元給B銀行的「一心」客戶,如果,交易成功的話,最後A銀行的「張三」必須變成8000,B銀行的「一心」會(huì)變成7000,但是,如果交易失敗的話,A銀行的「張三」必須10000,B銀行的「一心」為5000,而不能發(fā)生A銀行的「張三」為10000(未扣款),B銀行的「一心」也為7000(已入款)的情況或A銀行的「張三」為8000(已扣款),B銀行的「一心」也為50

28、00(未入款)等情況。,,,【解答】ch10-1-2_SQLQuery1.sql,【顯示結(jié)果】顯示A銀行的「張三」帳戶餘額(2) 顯示B銀行的「一心」帳戶餘額,【隨堂練習(xí)1】承上一實(shí)作題,假設(shè)A銀行的「張三」帳戶餘額小於2000元時(shí),在匯款之前尚未查詢,因此,欲匯出2000元給B銀行的「一心」時(shí),請(qǐng)問(wèn)如何實(shí)作呢?【解答】ch10-1-2_SQLQuery2.sql,【隨堂練習(xí)2】承上一實(shí)作題,假設(shè)A銀行的「張三」帳戶,欲匯出2

29、000元給B銀行的「一心」時(shí),但是,一心客戶已經(jīng)改為’B111’。請(qǐng)問(wèn)會(huì)產(chǎn)生什麼結(jié)果呢?【解答】匯款失敗,所以A銀行的「張三」帳戶餘額與B銀行的「張三」帳戶餘額不變。,10-2 交易的進(jìn)行模式,一個(gè)功能完整及安全的資訊系統(tǒng),在某一交易執(zhí)行時(shí),如果發(fā)生系統(tǒng)中斷,系統(tǒng)就必須要確保交易進(jìn)行中資料的一致性及正確性,在SQL Server中提供三種模式來(lái)進(jìn)行交易。一、自動(dòng)認(rèn)可交易(Auto commit Transaction)二、外顯交

30、易(Explicit Transaction)三、隱含交易(Implicit Transaction),10-2.1自動(dòng)認(rèn)可交易 (Auto commit Transaction),【定義】此種交易模式是SQL Server資料庫(kù)管理系統(tǒng)預(yù)設(shè)的模式,它是將個(gè)別的T-SQL指令視為一個(gè)交易。因此,當(dāng)T-SQL指令對(duì)資料庫(kù)的操作「成功」時(shí),就會(huì)自動(dòng)執(zhí)行Commit認(rèn)確,否則就會(huì)被Rollback復(fù)原?!靖拍顖D】個(gè)別

31、交易成功就會(huì)被執(zhí)行,【實(shí)作】加選三門(mén)課程(2筆成功,1筆失敗),假設(shè)在SQL Server中建立三個(gè)資料表及資料庫(kù)關(guān)聯(lián)圖,如下:,【解答】ch10-2-1_SQLQuery1.sql,【執(zhí)行結(jié)果】<新增了二門(mén)課程>【說(shuō)明】在「自動(dòng)認(rèn)可」模式中,每一個(gè)交易僅僅由一個(gè)T-SQL陳述式組成。因此,不必?fù)?dān)心每一個(gè)交易的明確開(kāi)始和結(jié)束。亦即每一個(gè)陳述式被SQL Server執(zhí)行之後即可立即被認(rèn)可。,10-2.2 外顯交易(E

32、xplicit Transaction),【定義】此種交易模式是透過(guò)Begin transaction來(lái)開(kāi)始進(jìn)行交易,並且以Rollback transaction或Commit transaction指令來(lái)結(jié)束交易。當(dāng)T-SQL指令對(duì)資料庫(kù)的一連串操作必須要全部「成功」時(shí),才會(huì)執(zhí)行Commit transaction 認(rèn)確,否則就會(huì)全部被執(zhí)行Rollback transaction 復(fù)原?!靖拍顖D】只有全部成功才會(huì)被執(zhí)行,(一)

33、第一種寫(xiě)法:,使用自訂函數(shù)(AddClass)【解答】ch10-2-2_SQLQuery1.sql,【執(zhí)行結(jié)果】<沒(méi)有新增成功;因?yàn)槿绻挟a(chǎn)生錯(cuò)誤時(shí), 則會(huì)全部Rollback>,(二)第二種寫(xiě)法,自動(dòng)ROLLBACK【解答】ch10-2-2_SQLQuery2.sql,(三)第三種寫(xiě)法,使用TRY...CATCH【解答

34、】ch10-2-2_SQLQuery3.sql,10-2.3 隱含交易(Implicit Transaction),【定義】此種交易模式是透過(guò)「set implicit_transactions on」的設(shè)定,來(lái)啟動(dòng)隱含交易。因此,它不需要在開(kāi)始交易時(shí)下達(dá)「Begin transaction」。當(dāng)T-SQL指令對(duì)資料庫(kù)的一連串操作必須要全部「成功」時(shí),才會(huì)執(zhí)行Commit transaction 認(rèn)確,否則就會(huì)全部被執(zhí)行Rollbac

35、k transaction 復(fù)原。【概念圖】只有全部成功才會(huì)被執(zhí)行,【解答】ch10-2-3_SQLQuery1.sql,10-3巢狀交易(Nested Transaction),除了以上三種交易模式之外,我們也可以使用「巢狀交易」?!径x】 是指在交易處理中再包含另一個(gè)交易?!臼褂脮r(shí)機(jī)】是在「預(yù)存程序」或「觸發(fā)程序」的交易。當(dāng)T-SQL指令對(duì)資料庫(kù)的一連串操作必須要全部「成功」時(shí),才會(huì)執(zhí)行Commit transaction

36、認(rèn)確,否則就會(huì)全部被執(zhí)行Rollback transaction 復(fù)原。,【概念圖】只有全部成功才會(huì)被執(zhí)行,【實(shí)作】,【解答】ch10-3_SQLQuery1.sql,,10-4設(shè)定交易儲(chǔ)存點(diǎn),【定義】是指在較龐大的交易過(guò)程中,執(zhí)行時(shí)間較花費(fèi)時(shí)間,因此,如果即將完成交易之前,發(fā)生無(wú)法預(yù)測(cè)的錯(cuò)誤時(shí),系統(tǒng)就必須要再執(zhí)行Rollback,所以,又要再花費(fèi)長(zhǎng)時(shí)間重新執(zhí)行一次。因此,適時(shí)的設(shè)定交易儲(chǔ)存點(diǎn)時(shí),就不必回復(fù)整個(gè)交易?!靖拍顖D】,說(shuō)明

37、:以上T-SQL指令集1,2,4三個(gè)交易會(huì)被執(zhí)行, 而T-SQL指令集3會(huì)被撤回。,【實(shí)作】,【解答】ch10-4_SQLQuery1.sql,【執(zhí)行結(jié)果】,10-5 交易的隔離等級(jí),【定義】隔離性是交易的保證之一,表示交易與交易之間不互相干擾,好像同時(shí)間就只有自己的交易存在一樣,隔離性保證的基本方式是在資料庫(kù)層面,也就是,對(duì)資料庫(kù)或相關(guān)欄位鎖定,因此,在同一時(shí)間內(nèi)只允許一個(gè)交易進(jìn)行更新或讀取。隔離交易的基

38、本方式是鎖定資料庫(kù),但是,在實(shí)務(wù)上,如果鎖定整個(gè)資料庫(kù)時(shí),將會(huì)導(dǎo)致嚴(yán)重的效能問(wèn)題,因此,實(shí)務(wù)上會(huì)根據(jù)資料讀寫(xiě)更新的頻繁性,來(lái)設(shè)定不同的交易隔離層級(jí)(transaction isolation level)。,常用交易隔離等級(jí),基本上,在SQL Server中常用的交易隔離等級(jí)四有種:1.Read Uncommitted(讀取未認(rèn)可) :最低級(jí)別的隔離性。2.Read Committed(讀取認(rèn)可):SQL Server預(yù)設(shè)的等級(jí)3

39、. Repeatable Read(可重覆讀取)4. Seriazable(序列化):最高級(jí)別的隔離性,1.Read Uncommitted(讀取未認(rèn)可),【定義】 指某個(gè)交易可以讀取另一個(gè)交易已更新但尚未commit的資料。此種 交易隔離等級(jí)是最差的方式,也就是完全沒(méi)有隔離效果,因此,可能 會(huì)讀取某一交易正在進(jìn)行中,並且尚未被Committed的中間結(jié)果。 因此,此種讀取方式又稱為「Dirty Re

40、ad」?!窘鉀Q方法】利用Read Committed【語(yǔ)法】【使用時(shí)機(jī)】查詢歷史性的資料?!咀⒁狻窟@個(gè)隔離層級(jí)讀取錯(cuò)誤資料的機(jī)率太高, 一般不會(huì)採(cǎi)用這種隔離層級(jí)。,2.Read Committed(讀取認(rèn)可),【定義】 在這個(gè)等級(jí)比read uncommited嚴(yán)格一些,它只允許讀取已認(rèn)可的 資料(已經(jīng)成為資料庫(kù)永久部分的資料)。所以允許unrepeatable read

41、,但不允許dirty read,亦即不允許讀取尚未執(zhí)行Commit的資料?!敬嬖趩?wèn)題】 當(dāng)交易1讀取資料之後,不會(huì)在乎交易2更改資料,造成不一致現(xiàn)象?!窘鉀Q方法】利用Repeatable Read【語(yǔ)法】,3. Repeatable Read(可重覆讀取),【定義】 此種交易隔離等級(jí)比read commited嚴(yán)格一些,它會(huì)鎖定查詢中的 資料,以防止其他交易更改資料,因此,可以確保每次交易所讀取 的

42、資料是相同的。【存在問(wèn)題】當(dāng)交易1讀取資料時(shí),交易2卻可以「新增」與「刪除」資料。【解決方法】利用SERIALIZABLE【語(yǔ)法】,4. Seriazable(序列化),【定義】 此種交易隔離等級(jí)是最嚴(yán)格的等級(jí),也就是說(shuō)某一交易所使用的所有 資料表,全部都會(huì)被鎖定。亦即同一個(gè)時(shí)間只能有一個(gè)交易,即所謂 的交易循序進(jìn)行,因此,無(wú)法提供並行交易處理。以避免資料表被其 他交易進(jìn)行新增、修改及刪除的操作。

43、【語(yǔ)法】,10-6 並行控制的必要性,【定義】並行控制就是使多個(gè)交易可以在同時(shí)間存取同一個(gè)資料項(xiàng)目,而這些交易之間不會(huì)互相干擾,即確保並行執(zhí)行的交易間的隔離性(Isolation)。為何並行控制是必要的,其原因如下四點(diǎn):1.遺失更新的問(wèn)題(Lost Update)2.未確認(rèn)相依的問(wèn)題(Uncommitted dependency problem; Dirt

44、y Read)3.不一致分析的問(wèn)題(Inconsistent Analysis problem)4.無(wú)法重複的讀取(Nonrepeatable read),10-6.1 遺失更新的問(wèn)題(Lost Update),【定義】 當(dāng)多個(gè)交易以交錯(cuò)的方式執(zhí)行,而且針對(duì)相同的資料項(xiàng)目做存取的動(dòng)作,會(huì)使得此資料目?jī)?nèi)容值不正確,亦即交易已經(jīng)更新的資料被另一個(gè)交易覆寫(xiě),使用某一個(gè)交易動(dòng)作無(wú)效。此時(shí)稱為遺失更新(Lost Update)。亦即某個(gè)交易

45、對(duì)欄位進(jìn)行更新的資訊,因另一個(gè)交易的介入而遺失。,【概念範(fàn)例】,假設(shè)現(xiàn)在有兩個(gè)交易,分別為T(mén)1與T2,時(shí)間由t1~t5,實(shí)際交易過(guò)程如下所示:假設(shè):x的預(yù)設(shè)值=10說(shuō)明:交易T1在時(shí)間t3更改資料項(xiàng)x值為100,而在時(shí)間t4時(shí)卻被交易T2覆蓋(Overwrite)為60,因此,交易T1在時(shí)間t5再讀取x值時(shí),卻是60而不是100。此種問(wèn)題稱為交易T1在時(shí)間t3的更新動(dòng)作遺失(Lost)現(xiàn)象。 所以,以上的排序「一定不是」可序

46、列化的排程(因?yàn)橛羞z失更新的問(wèn)題)。,,【實(shí)作】,假設(shè)現(xiàn)在有兩個(gè)交易,分別為交易T1與T2。而交易T1和T2同時(shí)線上預(yù)訂高鐵火車座位,目前高鐵火車座位數(shù)尚餘100個(gè),交易T1希望預(yù)訂10個(gè)座位,交易T2預(yù)訂20個(gè)座位。最後高鐵火車訂位資料庫(kù)的座位數(shù)卻還有80個(gè), 因此,交易T1在時(shí)間t5再讀取x值時(shí),卻是80而不是90因此,交易T1等於沒(méi)有執(zhí)行,因?yàn)榻灰譚1更新的座位數(shù)已經(jīng)被交易T2覆寫(xiě)。,,【解答】 ch10-6-01(交易1).sq

47、l 與 ch10-6-01(交易2).sql,,,,10-6.2 未確認(rèn)相依的問(wèn)題 (Uncommitted dependency problem;Dirty Read),【定義】又稱為暫時(shí)更新問(wèn)題,即對(duì)尚未認(rèn)可的資料進(jìn)行讀取。亦即第一個(gè)交易修改資料,而第二個(gè)交易在第一個(gè)交易「確認(rèn)前」讀取修改的資料。如果第一個(gè)交易中途發(fā)生故障,必須撤回(回復(fù))的情況。第二個(gè)交易將取得不正確的資料。,【概念範(fàn)例】,現(xiàn)在有兩個(gè)交易,分別

48、為T(mén)1與T2,時(shí)間由t1~t5,實(shí)際交易過(guò)程如下所示:假設(shè):x的預(yù)設(shè)值=10說(shuō)明:交易T1在時(shí)間t2更改資料項(xiàng)x值為100,並且被交易T2讀取(read),但交易T1在時(shí)間t4時(shí) Abort(撤回),因此,導(dǎo)致交易T2在t2時(shí)間所讀取交易T1的中間結(jié)果,產(chǎn)生錯(cuò)誤現(xiàn)象。,,實(shí)務(wù)範(fàn)例:,交易T1和T2存取同一位學(xué)生的成績(jī)記錄,交易T1在時(shí)間t2因?yàn)槌煽?jī)登記錯(cuò)誤,將那位學(xué)生的成績(jī)從80分改為90分,交易T2在時(shí)間t3讀取的是尚未

49、確認(rèn)交易的中間結(jié)果資料(90分),它是一個(gè)錯(cuò)誤的結(jié)果。,,【實(shí)作1】,檔案名稱:ch10-6-02(交易1).sql 與 ch10-6-02(交易2).sql,,【實(shí)作2】解決方法:READ COMMITTED,檔案名稱:ch10-6-02A(交易1).sql 與 ch10-6-02A(交易2).sql,,10-6.3 不一致分析的問(wèn)題 (I

50、nconsistent Analysis problem),【定義】 又稱為不正確總計(jì)問(wèn)題(Incorrect summary problem),指一個(gè)交易正在計(jì)算一群資料項(xiàng)目的聚合函數(shù)(Aggregate function)時(shí),其中某些資料項(xiàng)目被另一個(gè)交易更新,而造成聚合函數(shù)無(wú)法得到正確的結(jié)果?!驹]】聚合函數(shù)(Aggregate function):指用來(lái)計(jì)算及統(tǒng)計(jì)的函數(shù)?!纠纭?SUM(),AVERAGE(),COUN

51、T(),MAX(),MIN()。,概念範(fàn)例:,現(xiàn)在有兩個(gè)交易,分別為T(mén)1與T2,時(shí)間由t1~t7,實(shí)際交易過(guò)程如下所示:假設(shè):x的預(yù)設(shè)值=10, y的預(yù)設(shè)值=20,而交易T1欲求出SUM=2x+y=40。說(shuō)明:交易T1在時(shí)間t2讀取資料項(xiàng)x值為10,並且在時(shí)間t3時(shí)SUM的值指定為20(=2*10),在時(shí)間t4交易T2讀取y,並且在時(shí)間t5 更改y為60,因此,導(dǎo)致交易T1在時(shí)間t7時(shí)的SUM值為80,而不是40,產(chǎn)生不正

52、確的錯(cuò)誤現(xiàn)象。,,實(shí)務(wù)範(fàn)例:,交易T1和T2存取同一位客戶在銀行的X和Y兩個(gè)帳戶,交易前兩個(gè)帳戶餘額分別為700和300元,交易T1是計(jì)算兩個(gè)帳戶的存款總額,交易T2分別在x帳戶提出200元和y帳戶存入200。說(shuō)明:交易T1在時(shí)間t2讀取資料項(xiàng)x值為700,而交易T2在時(shí)間t3時(shí)讀取x值,並在時(shí)間t4時(shí)讀取y值,在時(shí)間t5 更改x為500及在時(shí)間t6 更改y為500,因此,導(dǎo)致交易T1在時(shí)間t8時(shí)的SUM值為1200,而不

53、是1000,產(chǎn)生不正確的錯(cuò)誤現(xiàn)象。,,【實(shí)作1】,檔案名稱:ch10-6-03(交易1).sql 與 ch10-6-03(交易2).sql,,執(zhí)行結(jié)果:,【實(shí)作2】,交易一(解決方法:Repeatable READ)檔案名稱:ch10-6-03A(交易1).sql 與 ch10-6-03A(交易2).sql,,執(zhí)行結(jié)果:,10-6.4 無(wú)法重複的讀取 (Nonr

54、epeatable read),【定義】重複的讀取會(huì)獲得不一致的資料。當(dāng)某一交易T1需要讀取同一項(xiàng)目資料兩次或兩次以上時(shí),但因?yàn)榱硪粋€(gè)交易T2在其讀取間隔期間內(nèi)修了該項(xiàng)目。如此,將會(huì)導(dǎo)致交易T1對(duì)同一個(gè)項(xiàng)目資料會(huì)有不同的結(jié)果。雖然Repeatable READ 可以解決不一致的問(wèn)題,但是,它卻存在另一個(gè)問(wèn)題就是,當(dāng)交易1在查詢時(shí),而交易2卻還可以進(jìn)行新增與刪除的問(wèn)題。因此,我們可以利用交易隔離中最嚴(yán)格的方式(SERIALIZABLE)

55、,就可以解決此一問(wèn)題。,【實(shí)作1】,問(wèn)題:當(dāng)交易讀取資料時(shí),交易卻可以新增與刪除資料檔案名稱:ch10-6-04(交易1).sql 與 ch10-6-04(交易2).sql,,【實(shí)作2】,解決方法:SERIALIZABLE檔案名稱:ch10-6-04A(交易1).sql 與 ch10-6-04A(交易2).sql,,SQL Server提供四種不同交易隔離等級(jí),針對(duì)並行控制的四個(gè)問(wèn)

溫馨提示

  • 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ù)僅提供信息存儲(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)論