版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第 十 章交易管理,課程名稱:資料庫系統(tǒng)授課老師:李春雄 博士,本章學(xué)習(xí)目標(biāo),1.讓讀者瞭解交易處理的流程及四大特性(ACID)。2.讓讀者瞭解並行控制(Concurrency Control)的技 術(shù)及交易的隔離等級。,本章內(nèi)容,10-1 何謂交易處理10-2 交易的進(jìn)行模式10-3 巢狀交易(Nested Transaction)10-4 設(shè)定交易儲存點(diǎn)10-5 交易的隔離等級10-6 並行控制的
2、必要性,10-1 何謂交易處理,【定義】交易(Transaction)乃是一連串不可分割的資料庫操作指令的集合。當(dāng)交易裡的每一個操作指令都成功時,該筆交易才算成功,否則交易就算失敗,必須恢復(fù)到交易前的資料狀態(tài)?!窘灰滋幚淼睦印课覀兿肟纯淬y行金錢往來的情況。假設(shè)有一位客戶從A銀行轉(zhuǎn)帳至B銀行,要做的動作為從A銀行的帳戶扣款、B銀行的帳戶加上轉(zhuǎn)帳的金額,兩個動作必須同時成功,只要有任何一個動作失敗,則此次轉(zhuǎn)帳失敗。如圖10-1所示。
3、,【交易程序圖】,在圖10-1中,要完成一個交易必須要經(jīng)過四個步驟,若萬一在進(jìn)行步驟4之前,銀行的資訊系統(tǒng)主機(jī)之電源中斷,或是發(fā)現(xiàn)到B銀行的帳戶不存在時,那要怎麼辦呢?這樣的話,在步驟2時提出來的2000元已經(jīng)不在A銀行的帳戶了,也不在B銀行的帳戶,那2000走去那裡呢?該不會銀行多賺了2000元吧!,為了不讓這樣的情況發(fā)生,我們可以使用交易處理來把一些對於資料庫的操作(A銀行扣掉2000元與B銀行存入2000元)視為同一個交易動作。因
4、此,當(dāng)交易裡的每一個操作指令都成功時,該筆交易才算成功,否則交易就算失敗,必須恢復(fù)到交易前的資料狀態(tài)。因此,在步驟2被扣掉的2000元,會因?yàn)榻灰资《詣颖换謴?fù)到交易前的資料狀態(tài)。,【交易程序圖】,我們可以撰寫下列的演算法來了解整個交易的過程:,由以上的演算法,我們大略可以得知,在資料庫中的交易要有三個基本的命令:BeginTransaction、Commit和Rollback。BeginTransaction標(biāo)示交易的開始。發(fā)生在B
5、eginTransaction和下一個命令(不是Rollback就是Commit)之間的任何事物會被視為交易的一部份。如圖10-2交易流程圖所示。,10-1.1 交易管理的四大特性,【交易目的】主要維持資料之間的以下四個目的1. 一致性(Consistency)2.完整性(Completeness)3.正確性(Correctness)4.並行控制(Concurrency)而交易進(jìn)行時,如何達(dá)到以上的目的,其最主要原因就是交易管
6、理具有四個特性(ACID)?!窘灰姿拇筇匦浴恳弧卧?Atomicity)二、一致性(Consistency)三、隔離性(Isolation)四、持久性(Durability),一、不可分割性(Atomicity),【定義】將交易過程的所有對資料庫操作視為同一個單元工作,其中可能包括許多步驟,這些步驟要嘛全部執(zhí)行成功,否則,整個交易宣告失敗。所以,整個交易是一個不可分割的邏輯單位。,【舉例】,假設(shè)現(xiàn)在有兩個交易,分別為T1
7、與T2,時間由t1~t6,實(shí)際交易過程如下所示:,因此,如果在交易t4時間Read (B)的讀取操作發(fā)生錯誤,交易管理需要避免t3時間所Write(A)的資料庫寫入操作,並不會真正寫入資料庫,因?yàn)橘Y料庫單元操作沒有全部執(zhí)行,就都不能執(zhí)行。,1.發(fā)生錯誤,整個交易視為不可分割的單位,2.不會真正寫入資料庫,延伸學(xué)習(xí):,資料庫的單元工作是由許多步驟所組成,而每一步驟就是每一句SQL命令的執(zhí)行。其基本的架構(gòu)如下:,說明
8、:以上的交易操作(SQL命令1,SQL命令2,…,SQL命令N),只要其中之一個SQL命令 產(chǎn)生錯誤時,將會導(dǎo)到整個交易失敗,並且執(zhí)行Rollback Transaction。,二、一致性(Consistency),【定義】指交易過程所異動的資料在交易前與交易後必須一致,資料庫的資料必須仍然滿足完整性限制條件(利用資料表中的Check與Foreign Key),即維持資料的一致性,如圖10-4所示:因
9、為,DBMS需要維持資料庫資料的一致性,同樣的,交易管理也必須要維持一致性。,,【舉例】,假設(shè)「張三」客戶欲從A銀行轉(zhuǎn)入2000元到B銀行,交易前「張三」在A銀行和B銀行的總和是15,000元,在交易完成後,A銀行和B銀行的總和必須還是15,000元,因此,在交易前後的帳戶總額是相同的。如下表所示:,三、隔離性(Isolation),【定義】隔離性是指多筆交易在同時交易時,雖然各交易是並行執(zhí)行,不過各交易之間應(yīng)該滿足獨(dú)立性,也就是說,一
10、個交易不會影響到其它交易的執(zhí)行結(jié)果,或被其它交易所干擾。,【舉例】,假設(shè)現(xiàn)在有兩個交易,分別為T1與T2,時間由t1~t5,實(shí)際交易過程如下所示:假設(shè):A的預(yù)設(shè)值=10說明:當(dāng)交易T1在時間t1時,會讀取A的預(yù)設(shè)值10,並且在t2時間將10改為20,而交易T2在時間t4讀取A值,結(jié)果交易T1在時間t5時Abort(撤回),形成交易T2所讀取的資料是不正確的,也必須要被Abort(撤回)。,,不正確(Dirty Read
11、),【分析】交易T1的資料更新到一半尚未完成確認(rèn)(Commit)時,卻被 交易T2來讀取,因此,交易T2只是取得交易T1的暫時性資 料,此現(xiàn)象就稱為Dirty Read?!窘鉀Q方法】利用鎖定(Lock)資料的方式來隔離交易。,,四、持久性(Durability),【定義】永久性是指當(dāng)交易完成執(zhí)行確認(rèn)交易(Commit)後,資料庫會保存交易後的結(jié)果,即使系統(tǒng)掛了,交易的結(jié)
12、果也不能遺失。如下圖所示:,,【兩種機(jī)制與ACID分析】,資料庫系統(tǒng)的交易管理是指「並行控制」和「回復(fù)技術(shù)」兩個機(jī)制的合稱,因此,我們可以將兩種機(jī)制與ACID分析如下:(1)「並行控制」機(jī)制是要維持「隔離性」和「一致性」保持(2)「回復(fù)技術(shù)」機(jī)制是維持交易處理的「不可分割性」和「永久性」,10-1.2 交易的狀態(tài)與進(jìn)行,一、交易的狀態(tài) 一個交易狀態(tài)是由活動狀態(tài)(Active)、部分確認(rèn)(Partially Committed)、
13、確認(rèn)(Committed)、失敗(Failed)及終止?fàn)顟B(tài)(Terminated)等五個狀態(tài)組合而成。如圖10-6交易狀態(tài)轉(zhuǎn)換圖如下所示:,1.活動狀態(tài)(Active State),【定義】當(dāng)「交易開始(Begin Transaction)」執(zhí)行時即進(jìn)入「活動狀態(tài)(Active State)」,在此狀態(tài)中可以對資料庫進(jìn)行一系列的讀(Read)及寫(Write)動作。,【舉例】網(wǎng)路銀行轉(zhuǎn)帳的例子,假設(shè)某一位家長欲轉(zhuǎn)帳2000元給就讀
14、遠(yuǎn)方學(xué)校的兒子生活費(fèi)用,因此,他必須要在ATM進(jìn)行以下的操作動作:步驟一:上網(wǎng)連到指定的網(wǎng)路銀行之網(wǎng)站步驟二:輸入「身份證字號/統(tǒng)一編號/客戶編號」 輸入「使用者名稱」 輸入「簽入密碼」,後再按「登入」 系統(tǒng)會自動檢查是否正確。如果正確時,則再進(jìn)行以下的步驟。步驟三:查詢目前的帳戶餘額步驟四:轉(zhuǎn)帳的操作動作……以上步驟三與步
15、驟四就是所謂的「活動狀態(tài)(Active State)」。,2.部分確認(rèn)狀態(tài) (Partially Committed State),【定義】指在對資料庫進(jìn)行各種單元操作完成之後,也就是交易結(jié)束。此時即可進(jìn)入「部分確認(rèn)狀態(tài)(Partially Committed State)」,在此狀態(tài)中「同步控制」動作將會去檢查是否干擾其他正在執(zhí)行中的交易。,【舉例】網(wǎng)路銀行轉(zhuǎn)帳的例子,步驟五:匯款的操作動作……完成之後,將會出現(xiàn)如下的
16、畫面:=======================================請再確認(rèn)轉(zhuǎn)帳資訊轉(zhuǎn)出帳號:A123456789 轉(zhuǎn)入帳號:B123456789 轉(zhuǎn)帳金額 新臺幣2,000元請您再確認(rèn)以上的轉(zhuǎn)帳資訊是否確正?「確認(rèn)」「消取」=======================================以上步驟就是所謂的「部分確認(rèn)狀態(tài)(Partially Committed State) 」。,3.確
17、認(rèn)狀態(tài)(Committed State),【定義】當(dāng)「活動狀態(tài)」與「部分確認(rèn)狀態(tài)」檢查動作都成功之後,即可進(jìn)入「確認(rèn)狀態(tài)(Committed State)」,亦即將交易過程真正的寫入資料庫中,表示此筆交易成功。,【舉例】網(wǎng)路銀行轉(zhuǎn)帳的例子,步驟六:在您按「確認(rèn)」交易動作之後,將會出現(xiàn)如下的畫面:=======================================
18、 轉(zhuǎn)帳成功交易時間: 2010/10/18 17:44:24跨行序號: 9896877轉(zhuǎn)出帳號:A123456789 轉(zhuǎn)入帳號:B123456789 轉(zhuǎn)帳金額:新臺幣2,000元轉(zhuǎn)帳手續(xù):費(fèi) 新臺幣12元 交易備註:家長轉(zhuǎn)帳2000元給就讀遠(yuǎn)方學(xué)校的兒子=======================================以上步驟就是所謂的「確認(rèn)狀態(tài)(Committed Stat
19、e) 」。,4.失敗狀態(tài)(Failed State),【定義】當(dāng)「活動狀態(tài)」或「部分確認(rèn)狀態(tài)」檢查動作其中一項(xiàng)失敗時,此時會被要求進(jìn)入「失敗狀態(tài)」,在此狀態(tài)中交易將會寫入「UNDO取消」動作,以回復(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)指令這兩種情況才會使交易結(jié)束。因此,如果在交易處理當(dāng)中,若執(zhí)行的操作有成功的話,可以使用確認(rèn)(Committed)指令。執(zhí)行確認(rèn)指令之後,交易功能的處理結(jié)果就會真正被反映出來。如果在交易處理當(dāng)中,若執(zhí)行的操作失敗時,或想要重新再來一次的話,可以執(zhí)行撤回(Rollback)指令。執(zhí)行撤回指令之後,原來的交易操作會變成無效,資料會回到原本執(zhí)行處理之前的狀態(tài)。,二、交易的
21、進(jìn)行,【定義】一個完整且成功的交易,必須要經(jīng)過一連串的交易動作,因此,我們必須要了解每一個交易動作的目的。如下所示:1.BEGIN TRANSACTION(又可寫成BEGIN TRAN)2.READ或WRITE3.同步控制動作檢查4.COMMIT TRANSACTION (又可寫成COMMIT TRAN、COMMIT或COMMIT WORK) 5.ROLLBACK TRANSACTION (
22、又可寫成ROLLBACK TRAN, ROLLBACK 或ROLLBACK WORK) 6.UNDO 7.REDO,1. BEGIN TRANSACTION,它又可寫成BEGIN TRAN【定義】 表示開始執(zhí)行交易。如果交易成功,就使用確認(rèn)交易COMMIT TRAN指令結(jié)束。【格式】 但是,如果交易失敗,回復(fù)交易是使用ROLLBACK TRAN指令結(jié)束?!靖袷健?2.READ或WRITE,
23、【定義】 表示對資料庫進(jìn)行讀寫動作。【舉例】 新增(寫入動作)一筆記錄到「學(xué)生資料表」中,3.同步控制動作檢查,【定義】對資料庫的各種操作完成之後,即可進(jìn)入部分確認(rèn)狀態(tài),並且準(zhǔn)備進(jìn)入Commit,在此某些同步控制動作將檢查其是否干擾其他正在執(zhí)行中的交易,同時也會有某些復(fù)原協(xié)定會去檢查。註:在 Transaction 中的每一項(xiàng)操作結(jié)束後都必須檢查 @@ERROR, 如果有錯誤產(chǎn)生時,
24、則@@ERROR就不等於0,4.COMMIT TRANSACTION,它又可寫成COMMIT TRAN、COMMIT或COMMIT WORK 【定義】確認(rèn)交易(Commit):如果交易執(zhí)行過程沒有錯誤,下達(dá)COMMIT指令,將交易更改的資料實(shí)際寫入資料庫,以便執(zhí)行下一個交易,如下所示:在確認(rèn)交易成功之後,並且保證交易的資料更新一定會反應(yīng)到資料庫中,因此,其對資料庫所作的改變會被確認(rèn),而不會被UNDO掉。,5.R
25、OLLBACK TRANSACTION,它又可寫成ROLLBACK TRAN, ROLLBACK 或ROLLBACK WORK 【定義】回復(fù)交易(Rollback):如果交易執(zhí)行過程有錯誤,就是下達(dá)ROLLBACK指令放棄交易,並將資料庫回復(fù)到交易前狀態(tài),如下所示:,6.UNDO,【定義】與ROLL BACK動作相似,但是只會被用來回復(fù)到未進(jìn)行單一動作前的狀態(tài),而不是整個交易。,7.REDO,【定義】這是要重複執(zhí)行某一交
26、易中的動作,以確定所有已被確認(rèn)的交易動作已經(jīng)成功的作用在資料庫中。,【範(fàn)例一】,確認(rèn)對資料庫所做的交易,【範(fàn)例二】,回復(fù)對資料庫所做的交易,【實(shí)作】,假設(shè)有A,B兩家銀行,其存款客戶資料及存款如下:(一)「匯款前」之後的A銀行與B銀行之客戶存款資料 A銀行客戶存款表 B銀行客戶存款表,(二)「匯款後(成功)」A銀行與B銀行之客戶存款資料A銀行客戶存款表
27、 B銀行客戶存款表現(xiàn)在A銀行的「張三」客戶欲匯款2000元給B銀行的「一心」客戶,如果,交易成功的話,最後A銀行的「張三」必須變成8000,B銀行的「一心」會變成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元時,在匯款之前尚未查詢,因此,欲匯出2000元給B銀行的「一心」時,請問如何實(shí)作呢?【解答】ch10-1-2_SQLQuery2.sql,【隨堂練習(xí)2】承上一實(shí)作題,假設(shè)A銀行的「張三」帳戶,欲匯出2
29、000元給B銀行的「一心」時,但是,一心客戶已經(jīng)改為’B111’。請問會產(chǎn)生什麼結(jié)果呢?【解答】匯款失敗,所以A銀行的「張三」帳戶餘額與B銀行的「張三」帳戶餘額不變。,10-2 交易的進(jìn)行模式,一個功能完整及安全的資訊系統(tǒng),在某一交易執(zhí)行時,如果發(fā)生系統(tǒng)中斷,系統(tǒng)就必須要確保交易進(jìn)行中資料的一致性及正確性,在SQL Server中提供三種模式來進(jìn)行交易。一、自動認(rèn)可交易(Auto commit Transaction)二、外顯交
30、易(Explicit Transaction)三、隱含交易(Implicit Transaction),10-2.1自動認(rèn)可交易 (Auto commit Transaction),【定義】此種交易模式是SQL Server資料庫管理系統(tǒng)預(yù)設(shè)的模式,它是將個別的T-SQL指令視為一個交易。因此,當(dāng)T-SQL指令對資料庫的操作「成功」時,就會自動執(zhí)行Commit認(rèn)確,否則就會被Rollback復(fù)原?!靖拍顖D】個別
31、交易成功就會被執(zhí)行,【實(shí)作】加選三門課程(2筆成功,1筆失敗),假設(shè)在SQL Server中建立三個資料表及資料庫關(guān)聯(lián)圖,如下:,【解答】ch10-2-1_SQLQuery1.sql,【執(zhí)行結(jié)果】<新增了二門課程>【說明】在「自動認(rèn)可」模式中,每一個交易僅僅由一個T-SQL陳述式組成。因此,不必?fù)?dān)心每一個交易的明確開始和結(jié)束。亦即每一個陳述式被SQL Server執(zhí)行之後即可立即被認(rèn)可。,10-2.2 外顯交易(E
32、xplicit Transaction),【定義】此種交易模式是透過Begin transaction來開始進(jìn)行交易,並且以Rollback transaction或Commit transaction指令來結(jié)束交易。當(dāng)T-SQL指令對資料庫的一連串操作必須要全部「成功」時,才會執(zhí)行Commit transaction 認(rèn)確,否則就會全部被執(zhí)行Rollback transaction 復(fù)原?!靖拍顖D】只有全部成功才會被執(zhí)行,(一)
33、第一種寫法:,使用自訂函數(shù)(AddClass)【解答】ch10-2-2_SQLQuery1.sql,【執(zhí)行結(jié)果】<沒有新增成功;因?yàn)槿绻挟a(chǎn)生錯誤時, 則會全部Rollback>,(二)第二種寫法,自動ROLLBACK【解答】ch10-2-2_SQLQuery2.sql,(三)第三種寫法,使用TRY...CATCH【解答
34、】ch10-2-2_SQLQuery3.sql,10-2.3 隱含交易(Implicit Transaction),【定義】此種交易模式是透過「set implicit_transactions on」的設(shè)定,來啟動隱含交易。因此,它不需要在開始交易時下達(dá)「Begin transaction」。當(dāng)T-SQL指令對資料庫的一連串操作必須要全部「成功」時,才會執(zhí)行Commit transaction 認(rèn)確,否則就會全部被執(zhí)行Rollbac
35、k transaction 復(fù)原。【概念圖】只有全部成功才會被執(zhí)行,【解答】ch10-2-3_SQLQuery1.sql,10-3巢狀交易(Nested Transaction),除了以上三種交易模式之外,我們也可以使用「巢狀交易」?!径x】 是指在交易處理中再包含另一個交易?!臼褂脮r機(jī)】是在「預(yù)存程序」或「觸發(fā)程序」的交易。當(dāng)T-SQL指令對資料庫的一連串操作必須要全部「成功」時,才會執(zhí)行Commit transaction
36、認(rèn)確,否則就會全部被執(zhí)行Rollback transaction 復(fù)原。,【概念圖】只有全部成功才會被執(zhí)行,【實(shí)作】,【解答】ch10-3_SQLQuery1.sql,,10-4設(shè)定交易儲存點(diǎn),【定義】是指在較龐大的交易過程中,執(zhí)行時間較花費(fèi)時間,因此,如果即將完成交易之前,發(fā)生無法預(yù)測的錯誤時,系統(tǒng)就必須要再執(zhí)行Rollback,所以,又要再花費(fèi)長時間重新執(zhí)行一次。因此,適時的設(shè)定交易儲存點(diǎn)時,就不必回復(fù)整個交易?!靖拍顖D】,說明
37、:以上T-SQL指令集1,2,4三個交易會被執(zhí)行, 而T-SQL指令集3會被撤回。,【實(shí)作】,【解答】ch10-4_SQLQuery1.sql,【執(zhí)行結(jié)果】,10-5 交易的隔離等級,【定義】隔離性是交易的保證之一,表示交易與交易之間不互相干擾,好像同時間就只有自己的交易存在一樣,隔離性保證的基本方式是在資料庫層面,也就是,對資料庫或相關(guān)欄位鎖定,因此,在同一時間內(nèi)只允許一個交易進(jìn)行更新或讀取。隔離交易的基
38、本方式是鎖定資料庫,但是,在實(shí)務(wù)上,如果鎖定整個資料庫時,將會導(dǎo)致嚴(yán)重的效能問題,因此,實(shí)務(wù)上會根據(jù)資料讀寫更新的頻繁性,來設(shè)定不同的交易隔離層級(transaction isolation level)。,常用交易隔離等級,基本上,在SQL Server中常用的交易隔離等級四有種:1.Read Uncommitted(讀取未認(rèn)可) :最低級別的隔離性。2.Read Committed(讀取認(rèn)可):SQL Server預(yù)設(shè)的等級3
39、. Repeatable Read(可重覆讀取)4. Seriazable(序列化):最高級別的隔離性,1.Read Uncommitted(讀取未認(rèn)可),【定義】 指某個交易可以讀取另一個交易已更新但尚未commit的資料。此種 交易隔離等級是最差的方式,也就是完全沒有隔離效果,因此,可能 會讀取某一交易正在進(jìn)行中,並且尚未被Committed的中間結(jié)果。 因此,此種讀取方式又稱為「Dirty Re
40、ad」?!窘鉀Q方法】利用Read Committed【語法】【使用時機(jī)】查詢歷史性的資料?!咀⒁狻窟@個隔離層級讀取錯誤資料的機(jī)率太高, 一般不會採用這種隔離層級。,2.Read Committed(讀取認(rèn)可),【定義】 在這個等級比read uncommited嚴(yán)格一些,它只允許讀取已認(rèn)可的 資料(已經(jīng)成為資料庫永久部分的資料)。所以允許unrepeatable read
41、,但不允許dirty read,亦即不允許讀取尚未執(zhí)行Commit的資料?!敬嬖趩栴}】 當(dāng)交易1讀取資料之後,不會在乎交易2更改資料,造成不一致現(xiàn)象?!窘鉀Q方法】利用Repeatable Read【語法】,3. Repeatable Read(可重覆讀取),【定義】 此種交易隔離等級比read commited嚴(yán)格一些,它會鎖定查詢中的 資料,以防止其他交易更改資料,因此,可以確保每次交易所讀取 的
42、資料是相同的?!敬嬖趩栴}】當(dāng)交易1讀取資料時,交易2卻可以「新增」與「刪除」資料?!窘鉀Q方法】利用SERIALIZABLE【語法】,4. Seriazable(序列化),【定義】 此種交易隔離等級是最嚴(yán)格的等級,也就是說某一交易所使用的所有 資料表,全部都會被鎖定。亦即同一個時間只能有一個交易,即所謂 的交易循序進(jìn)行,因此,無法提供並行交易處理。以避免資料表被其 他交易進(jìn)行新增、修改及刪除的操作。
43、【語法】,10-6 並行控制的必要性,【定義】並行控制就是使多個交易可以在同時間存取同一個資料項(xiàng)目,而這些交易之間不會互相干擾,即確保並行執(zhí)行的交易間的隔離性(Isolation)。為何並行控制是必要的,其原因如下四點(diǎn):1.遺失更新的問題(Lost Update)2.未確認(rèn)相依的問題(Uncommitted dependency problem; Dirt
44、y Read)3.不一致分析的問題(Inconsistent Analysis problem)4.無法重複的讀?。∟onrepeatable read),10-6.1 遺失更新的問題(Lost Update),【定義】 當(dāng)多個交易以交錯的方式執(zhí)行,而且針對相同的資料項(xiàng)目做存取的動作,會使得此資料目內(nèi)容值不正確,亦即交易已經(jīng)更新的資料被另一個交易覆寫,使用某一個交易動作無效。此時稱為遺失更新(Lost Update)。亦即某個交易
45、對欄位進(jìn)行更新的資訊,因另一個交易的介入而遺失。,【概念範(fàn)例】,假設(shè)現(xiàn)在有兩個交易,分別為T1與T2,時間由t1~t5,實(shí)際交易過程如下所示:假設(shè):x的預(yù)設(shè)值=10說明:交易T1在時間t3更改資料項(xiàng)x值為100,而在時間t4時卻被交易T2覆蓋(Overwrite)為60,因此,交易T1在時間t5再讀取x值時,卻是60而不是100。此種問題稱為交易T1在時間t3的更新動作遺失(Lost)現(xiàn)象。 所以,以上的排序「一定不是」可序
46、列化的排程(因?yàn)橛羞z失更新的問題)。,,【實(shí)作】,假設(shè)現(xiàn)在有兩個交易,分別為交易T1與T2。而交易T1和T2同時線上預(yù)訂高鐵火車座位,目前高鐵火車座位數(shù)尚餘100個,交易T1希望預(yù)訂10個座位,交易T2預(yù)訂20個座位。最後高鐵火車訂位資料庫的座位數(shù)卻還有80個, 因此,交易T1在時間t5再讀取x值時,卻是80而不是90因此,交易T1等於沒有執(zhí)行,因?yàn)榻灰譚1更新的座位數(shù)已經(jīng)被交易T2覆寫。,,【解答】 ch10-6-01(交易1).sq
47、l 與 ch10-6-01(交易2).sql,,,,10-6.2 未確認(rèn)相依的問題 (Uncommitted dependency problem;Dirty Read),【定義】又稱為暫時更新問題,即對尚未認(rèn)可的資料進(jìn)行讀取。亦即第一個交易修改資料,而第二個交易在第一個交易「確認(rèn)前」讀取修改的資料。如果第一個交易中途發(fā)生故障,必須撤回(回復(fù))的情況。第二個交易將取得不正確的資料。,【概念範(fàn)例】,現(xiàn)在有兩個交易,分別
48、為T1與T2,時間由t1~t5,實(shí)際交易過程如下所示:假設(shè):x的預(yù)設(shè)值=10說明:交易T1在時間t2更改資料項(xiàng)x值為100,並且被交易T2讀取(read),但交易T1在時間t4時 Abort(撤回),因此,導(dǎo)致交易T2在t2時間所讀取交易T1的中間結(jié)果,產(chǎn)生錯誤現(xiàn)象。,,實(shí)務(wù)範(fàn)例:,交易T1和T2存取同一位學(xué)生的成績記錄,交易T1在時間t2因?yàn)槌煽兊怯涘e誤,將那位學(xué)生的成績從80分改為90分,交易T2在時間t3讀取的是尚未
49、確認(rèn)交易的中間結(jié)果資料(90分),它是一個錯誤的結(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 不一致分析的問題 (I
50、nconsistent Analysis problem),【定義】 又稱為不正確總計問題(Incorrect summary problem),指一個交易正在計算一群資料項(xiàng)目的聚合函數(shù)(Aggregate function)時,其中某些資料項(xiàng)目被另一個交易更新,而造成聚合函數(shù)無法得到正確的結(jié)果。【註】聚合函數(shù)(Aggregate function):指用來計算及統(tǒng)計的函數(shù)。【例如】 SUM(),AVERAGE(),COUN
51、T(),MAX(),MIN()。,概念範(fàn)例:,現(xiàn)在有兩個交易,分別為T1與T2,時間由t1~t7,實(shí)際交易過程如下所示:假設(shè):x的預(yù)設(shè)值=10, y的預(yù)設(shè)值=20,而交易T1欲求出SUM=2x+y=40。說明:交易T1在時間t2讀取資料項(xiàng)x值為10,並且在時間t3時SUM的值指定為20(=2*10),在時間t4交易T2讀取y,並且在時間t5 更改y為60,因此,導(dǎo)致交易T1在時間t7時的SUM值為80,而不是40,產(chǎn)生不正
52、確的錯誤現(xiàn)象。,,實(shí)務(wù)範(fàn)例:,交易T1和T2存取同一位客戶在銀行的X和Y兩個帳戶,交易前兩個帳戶餘額分別為700和300元,交易T1是計算兩個帳戶的存款總額,交易T2分別在x帳戶提出200元和y帳戶存入200。說明:交易T1在時間t2讀取資料項(xiàng)x值為700,而交易T2在時間t3時讀取x值,並在時間t4時讀取y值,在時間t5 更改x為500及在時間t6 更改y為500,因此,導(dǎo)致交易T1在時間t8時的SUM值為1200,而不
53、是1000,產(chǎn)生不正確的錯誤現(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 無法重複的讀取 (Nonr
54、epeatable read),【定義】重複的讀取會獲得不一致的資料。當(dāng)某一交易T1需要讀取同一項(xiàng)目資料兩次或兩次以上時,但因?yàn)榱硪粋€交易T2在其讀取間隔期間內(nèi)修了該項(xiàng)目。如此,將會導(dǎo)致交易T1對同一個項(xiàng)目資料會有不同的結(jié)果。雖然Repeatable READ 可以解決不一致的問題,但是,它卻存在另一個問題就是,當(dāng)交易1在查詢時,而交易2卻還可以進(jìn)行新增與刪除的問題。因此,我們可以利用交易隔離中最嚴(yán)格的方式(SERIALIZABLE)
55、,就可以解決此一問題。,【實(shí)作1】,問題:當(dāng)交易讀取資料時,交易卻可以新增與刪除資料檔案名稱: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提供四種不同交易隔離等級,針對並行控制的四個問
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 資料結(jié)構(gòu)
- 吉他課程資料
- cad課程資料
- 課程結(jié)構(gòu)
- 課程資料收集 (24)
- 資料(鋼結(jié)構(gòu)資料全套表格)
- 資料結(jié)構(gòu)(datastructures)
- 雙溪課程評量表資料
- 資料結(jié)構(gòu)_課程-南華大學(xué)資訊管理學(xué)系暨研究所
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計c語言版飛機(jī) 訂票 系統(tǒng)資料
- 鋼筋混凝土結(jié)構(gòu)課程設(shè)計離線作業(yè)答案收集資料
- 課程論復(fù)習(xí)資料
- 抖音小白課程資料
- 鋼結(jié)構(gòu)資料匯總
- 管理學(xué)課程信息資料
- 水力學(xué)課程習(xí)題資料
- 燙發(fā)基礎(chǔ)入門知識資料課程
- android課程設(shè)計報告資料
- 抖音課程培訓(xùn)資料
- 抖音課程培訓(xùn)資料
評論
0/150
提交評論