系統(tǒng)實(shí)現(xiàn)技術(shù)——事務(wù)和鎖_第1頁
系統(tǒng)實(shí)現(xiàn)技術(shù)——事務(wù)和鎖_第2頁
系統(tǒng)實(shí)現(xiàn)技術(shù)——事務(wù)和鎖_第3頁
系統(tǒng)實(shí)現(xiàn)技術(shù)——事務(wù)和鎖_第4頁
系統(tǒng)實(shí)現(xiàn)技術(shù)——事務(wù)和鎖_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第八章 系統(tǒng)實(shí)現(xiàn)技術(shù) 事務(wù)和鎖,本章重要概念,(1)事務(wù)的定義,COMMIT和ROLLBACK的語義,事務(wù)的ACID性質(zhì),事務(wù)的狀態(tài)變遷圖。(2)存儲器類型,穩(wěn)定存儲器的實(shí)現(xiàn),數(shù)據(jù)傳送過程。(3)恢復(fù)的定義、基本原則和實(shí)現(xiàn)方法,故障的類型,檢查點(diǎn)技術(shù),REDO和UNDO操作,運(yùn)行記錄優(yōu)先原則。(4)并發(fā)操作帶來的三個(gè)問題,X鎖、S鎖、使用X鎖和S鎖的操作,封鎖協(xié)議,活鎖、餓死和死鎖,并發(fā)調(diào)度、串行調(diào)度、并發(fā)調(diào)度的可串行化,SQL中事務(wù)的存取模式和隔離級別,基于時(shí)標(biāo)的并發(fā)控制。,第8章 系統(tǒng)實(shí)現(xiàn)技術(shù),8.1 事務(wù)8.2 數(shù)據(jù)庫的恢復(fù)8.3 數(shù)據(jù)庫的并發(fā)控制,8.1 事務(wù),8.1.1 事務(wù)的定義 8.1.2 事務(wù)的ACID性質(zhì),為什么需要事務(wù)8.1-1,例如,銀行轉(zhuǎn)帳問題: 假定資金從帳戶A轉(zhuǎn)到帳戶B,至少需要兩步:帳戶A的資金減少然后帳戶B的資金相應(yīng)增加,為什么需要事務(wù)8.1-2,CREATE TABLE bank( customerName CHAR(10), -顧客姓名 currentMoney MONEY -當(dāng)前余額)GOALTER TABLE bank ADD CONSTRAINT CK_currentMoney CHECK(currentMoney=1)GOINSERT INTO bank(customerName,currentMoney) VALUES(張三,1000)INSERT INTO bank(customerName,currentMoney) VALUES(李四,1),創(chuàng)建帳戶表,存放用戶的帳戶信息,添加約束:根據(jù)銀行規(guī)定,帳戶余額不能少于1元,否則視為銷戶,張三開戶,開戶金額為1000元 ;李四開戶,開戶金額1元,為什么需要事務(wù)8.1-3,目前兩個(gè)帳戶的余額總和為:1000+1=1001元,為什么需要事務(wù)8.1-4,模擬實(shí)現(xiàn)轉(zhuǎn)帳 : 從張三的帳戶轉(zhuǎn)帳1000元到李四的帳戶,/*-轉(zhuǎn)帳測試:張三轉(zhuǎn)賬1000元給李四-*/-我們可能會這樣這樣編寫語句-張三的帳戶少1000元,李四的帳戶多1000元UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=張三UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四GO-再次查看轉(zhuǎn)帳后的結(jié)果。 SELECT * FROM bankGO,請問:執(zhí)行轉(zhuǎn)帳語句后,張三、李四的帳戶余額為多少?,張三的帳戶沒有減少 但李四的帳戶卻多了1000元 100010012001元 總額多出了1000元!,為什么需要事務(wù)8.1-5,-張三的帳戶減少1000元,李四的帳戶增加1000元UPDATE bank SET currentMoney=currentMoney-1000 WHERE customerName=張三UPDATE bank SET currentMoney=currentMoney+1000 WHERE customerName=李四GO,錯(cuò)誤原因分析:,UPDATE語句違反約束:余額=1元,執(zhí)行失敗,所以張三還是1000元,繼續(xù)往下執(zhí)行:執(zhí)行成功,所以李四變?yōu)?001元,如何解決呢?使用事務(wù),8.1.1 事務(wù)的定義(1),定義8.1 事務(wù)(transaction)是構(gòu)成單一邏輯工作單元的操作集合,要么完整地執(zhí)行,要么完全不執(zhí)行。不論發(fā)生何種情況,DBS必須保證事務(wù)能正確、完整地執(zhí)行。 在程序中,事務(wù)以BEGIN TRANSACTION語句開始,以COMMIT語句或ROLLBACK語句結(jié)束。 COMMIT語句表示事務(wù)執(zhí)行成功地結(jié)束(提交),此時(shí)告訴系統(tǒng),數(shù)據(jù)庫要進(jìn)入一個(gè)新的正確狀態(tài),該事務(wù)對數(shù)據(jù)庫的所有更新都已交付實(shí)施(寫入磁盤)。 ROLLBACK語句表示事務(wù)執(zhí)行不成功地結(jié)束(應(yīng)該“回退”),此時(shí)告訴系統(tǒng),已發(fā)生錯(cuò)誤,數(shù)據(jù)庫可能處在不正確的狀態(tài),該事務(wù)對數(shù)據(jù)庫的所有更新必須被撤消,數(shù)據(jù)庫應(yīng)恢復(fù)該事務(wù)到初始狀態(tài)。,用戶定義的一個(gè)對數(shù)據(jù)庫讀寫操作序列一個(gè)不可分割的工作單位數(shù)據(jù)庫恢復(fù)和并發(fā)控制的基本單位數(shù)據(jù)庫系統(tǒng)中通常有多個(gè)事務(wù)并行運(yùn)行事務(wù)和程序比較在關(guān)系數(shù)據(jù)庫中,一個(gè)事務(wù)可以是一條或多條SQL語句,也可以包含一個(gè)或多個(gè)程序。一個(gè)程序通常包含多個(gè)事務(wù),轉(zhuǎn)帳過程就是一個(gè)事務(wù)。它需要兩條UPDATE語句來完成,這兩條語句是一個(gè)整體,如果其中任一條出現(xiàn)錯(cuò)誤,則整個(gè)轉(zhuǎn)帳業(yè)務(wù)也應(yīng)取消,兩個(gè)帳戶中的余額應(yīng)恢復(fù)到原來的數(shù)據(jù),從而確保轉(zhuǎn)帳前和轉(zhuǎn)帳后的余額不變,即都是1001元。,8.1.1 事務(wù)的定義(2),8.1.1 事務(wù)的定義(3),例8.1 設(shè)銀行數(shù)據(jù)庫中有一轉(zhuǎn)賬事務(wù)T,從賬號A轉(zhuǎn)一筆款子($50)到賬號B,其操作如下:T:read(A); A:=A50; write(A); read(B); B:=B + 50; write(B).,組織成如下事務(wù):T:BEGIN RANSACTION; read(A); A:=A-50;write(A);if(A0)ROLLBACK;else read(B); B:=B+50; write(B); COMMIT;,8.1.1 事務(wù)的定義(4),對數(shù)據(jù)庫的訪問是建立在讀和寫兩個(gè)操作的基礎(chǔ)上的:read(X):把數(shù)據(jù)X,從磁盤的數(shù)據(jù)庫中讀到內(nèi)存的緩沖區(qū)中。write(X):把數(shù)據(jù)X,從內(nèi)存緩沖區(qū)中寫回磁盤的數(shù)據(jù)庫。 在系統(tǒng)運(yùn)行時(shí),write操作未必導(dǎo)致數(shù)據(jù)立即寫回磁盤,很可能先暫存在內(nèi)存緩沖區(qū)中,稍后再寫回磁盤。這件事情是DBMS實(shí)現(xiàn)時(shí)必須注意的問題。,8.1.2 事務(wù)的ACID性質(zhì),性質(zhì):原子性(Atomicity):事務(wù)是一個(gè)不可分割的工作單元,事務(wù)中的操作要么都做,要么都不做 (All or None) 一致性(Consistency):即數(shù)據(jù)不會應(yīng)事務(wù)的執(zhí)行而遭受破壞。事務(wù)執(zhí)行的結(jié)果必須使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變到另一個(gè)一致性狀態(tài)。與原子性密切相關(guān)。隔離性(Isolation):在多個(gè)事務(wù)并發(fā)執(zhí)行時(shí),系統(tǒng)應(yīng)保證與這些事務(wù)先后單獨(dú)執(zhí)行時(shí)的結(jié)果一樣。 持久性(Durability):一個(gè)事務(wù)一旦完成全部操作后,它對數(shù)據(jù)庫的所有更新應(yīng)永久地反映在數(shù)據(jù)庫中。,8.2 數(shù)據(jù)庫的恢復(fù),8.2.1 存儲器結(jié)構(gòu) 8.2.2 恢復(fù)的基本原則和實(shí)現(xiàn)方法8.2.3 故障類型和恢復(fù)方法8.2.4 檢查點(diǎn)技術(shù)8.2.5 SQL對事務(wù)的支持,8.2.1 存儲器結(jié)構(gòu)(1),1.存儲器類型易失性存儲器(volatile storage) 內(nèi)存、cache存儲器 非易失性存儲器(nonvolatile storage) 磁盤和磁帶 穩(wěn)定存儲器(stable storage)這是一個(gè)理論上的概念。存儲在穩(wěn)定存儲器中的信息是決不會丟失的。 2.穩(wěn)定存儲器的實(shí)現(xiàn)數(shù)據(jù)備份 數(shù)據(jù)銀行,8.2.1 存儲器結(jié)構(gòu)(2),3. 數(shù)據(jù)訪問塊、物理塊和緩沖塊塊的操作input(A):把物理塊A的內(nèi)容傳送到內(nèi)存的緩沖塊中。Output(B):把緩沖塊B的內(nèi)容傳送到磁盤中恰當(dāng)?shù)奈锢韷K中,8.2.1 存儲器結(jié)構(gòu)(3),8.2.1 存儲器結(jié)構(gòu)(4),4. 恢復(fù)和原子性的聯(lián)系,8.2.2恢復(fù)的基本原則和實(shí)現(xiàn)方法,基本原則 :“冗余”,即數(shù)據(jù)庫重復(fù)存儲。具體實(shí)現(xiàn)方法 平時(shí)做好兩件事:轉(zhuǎn)儲和建立日志周期地(比如一天一次)對整個(gè)數(shù)據(jù)庫進(jìn)行拷貝,轉(zhuǎn)儲到另一個(gè)磁盤或磁帶一類存儲介質(zhì)中。 建立日志數(shù)據(jù)庫。記錄事務(wù)的開始、結(jié)束及數(shù)據(jù)每一次插入、刪除和修改前后的值,并寫到“日志”庫中。一旦發(fā)生數(shù)據(jù)庫故障,分兩種情況進(jìn)行處理 如果數(shù)據(jù)庫已被破壞,則裝入last數(shù)據(jù)庫備份,再利用日志庫將這兩個(gè)數(shù)據(jù)庫狀態(tài)之間的所有更新重新做一遍。如果數(shù)據(jù)庫未被破壞,但某些數(shù)據(jù)不可靠,則撤消所有不可靠的修改,把數(shù)據(jù)庫恢復(fù)到正確的狀態(tài)。,8.2.3 故障類型和恢復(fù)方法(1),1.事務(wù)故障可以預(yù)期的事務(wù)故障,如存款余額透支等非預(yù)期事務(wù)故障,如運(yùn)算溢出、數(shù)據(jù)錯(cuò)誤、死鎖等2.系統(tǒng)故障:硬件故障、軟件錯(cuò)誤或掉電等,重新啟動時(shí),具體處理分兩種情況考慮。對未完成事務(wù)作UNDO處理;對已提交事務(wù)但更新還留在緩沖區(qū)的事務(wù)進(jìn)行REDO處理。,8.2.3 故障類型和恢復(fù)方法(2),3介質(zhì)故障在發(fā)生介質(zhì)故障和遭受病毒破壞時(shí),磁盤上的物理數(shù)據(jù)庫遭到毀滅性破壞。此時(shí)恢復(fù)的過程如下:重裝最近轉(zhuǎn)儲的后備副本到新的磁盤,使數(shù)據(jù)庫恢復(fù)到轉(zhuǎn)儲時(shí)的一致狀態(tài)。在日志中找出最近轉(zhuǎn)儲以后所有已提交的事務(wù)。對這些已提交的事務(wù)進(jìn)行REDO處理,將數(shù)據(jù)庫恢復(fù)到故障前某一時(shí)刻的一致狀態(tài)。在實(shí)際中,系統(tǒng)故障通常稱為軟故障(Soft Crash),介質(zhì)故障通常稱為硬故障(Hard Crash)。,8.2.4 檢查點(diǎn)技術(shù)(1),1檢查點(diǎn)方法 在DBS運(yùn)行時(shí),DBMS定時(shí)設(shè)置檢查點(diǎn)。在檢查點(diǎn)時(shí)刻才真正做到把對DB的修改寫到磁盤,并在日志文件寫入一條檢查點(diǎn)記錄(以便恢復(fù)時(shí)使用)。當(dāng)DB需要恢復(fù)時(shí),只有那些在檢查點(diǎn)后面的事務(wù)需要恢復(fù)。,事務(wù)T1不必恢復(fù);事務(wù)T2和事務(wù)T4必須重做(REDO);事務(wù)T3和事務(wù)T5必須撤消(UNDO)。,8.2.4 檢查點(diǎn)技術(shù)(2),2檢查點(diǎn)方法的恢復(fù)算法:分成兩步。(1)根據(jù)日志文件建立事務(wù)重做隊(duì)列和事務(wù)撤銷隊(duì)列。此時(shí),從頭掃描日志文件(正向掃描)。(2)對重做隊(duì)列中的事務(wù)進(jìn)行REDO處理,對撤銷隊(duì)列中的事務(wù)進(jìn)行UNDO處理。進(jìn)行REDO處理的方法是:正向掃描日志文件,根據(jù)重做隊(duì)列的記錄對每一個(gè)重做事務(wù)重新實(shí)施對數(shù)據(jù)庫的更新操作。進(jìn)行UNDO處理的方法是:反向掃描日志文件,根據(jù)撤銷隊(duì)列的記錄對每一個(gè)撤銷事務(wù)的更新操作執(zhí)行逆操作。,8.2.5 SQL對事務(wù)的支持,無begin transactionCommitRollback,8.3 數(shù)據(jù)庫的并發(fā)控制,8.3.1 并發(fā)操作帶來的三個(gè)問題8.3.2 封鎖技術(shù)8.3.3 封鎖帶來的問題8.3.4 并發(fā)操作的調(diào)度8.3.5 SQL對事務(wù)處理的支持,8.3.1并發(fā)操作帶來的三個(gè)問題(1),圖8.5 在時(shí)間t8丟失了事務(wù)T1的更新(FIND表示從DB中讀值,UPD表示把值寫回到DB),1丟失更新問題(例8.2),8.3.1并發(fā)操作帶來的三個(gè)問題(2),圖8.6 事務(wù)T2在時(shí)間t4讀了未提交的A值(80),2讀臟數(shù)據(jù)問題(例8.3,用戶讀了“臟數(shù)據(jù)”,但沒有破壞數(shù)據(jù)庫的完整性),8.3.1并發(fā)操作帶來的三個(gè)問題(3),圖8.8 事務(wù)T2在時(shí)間t4讀了未提交的A值,并在時(shí)間t8丟失了自己的更新,2讀臟數(shù)據(jù)問題(例8.4,用戶讀了“臟數(shù)據(jù)”,引起自身的更新操作被丟失,破壞了數(shù)據(jù)庫的完整

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論