事務(wù)基本概念
- 事務(wù)是一系列的數(shù)據(jù)庫操作,是數(shù)據(jù)庫應(yīng)用程序的基本邏輯單位掺炭,即應(yīng)用程序?qū)?shù)據(jù)庫的操作都應(yīng)該以事務(wù)的方式進(jìn)行
- 事務(wù)是一個操作序列辫诅,這些操作“要么全都做,要么全都不做”涧狮,是數(shù)據(jù)庫環(huán)境中不可分割的邏輯單位
- 事務(wù)四個特性:
1)原子性:事務(wù)的所有操作在數(shù)據(jù)庫中要么全做要么全都不做
2)一致性:一個事務(wù)獨(dú)立執(zhí)行的結(jié)果炕矮,將保持?jǐn)?shù)據(jù)的一致性,即數(shù)據(jù)不會因?yàn)槭聞?wù)的執(zhí)行而遭受破壞
3)隔離性:一個事務(wù)的執(zhí)行不能被其他事務(wù)干擾者冤。并發(fā)事務(wù)在執(zhí)行過程中可能會對同一數(shù)據(jù)進(jìn)行操作肤视,這些事務(wù)的操作應(yīng)該不會互相干擾,是相互隔離的
4)持久性:一個事務(wù)一旦提交涉枫,它對數(shù)據(jù)庫的改變必須是永久的邢滑,即使系統(tǒng)出現(xiàn)故障時也是如此 -
事務(wù)的五種狀態(tài):
1)活動狀態(tài):事務(wù)的初始狀態(tài),事務(wù)執(zhí)行時處于這個狀態(tài)
2)部分提交狀態(tài):部分提交狀態(tài):當(dāng)操作序列的最后一條語句自動執(zhí)行后愿汰,事務(wù)處于部分提交狀態(tài)這時困后,事務(wù)雖然已經(jīng)完全執(zhí)行,但由于實(shí)際輸出可能還臨時駐留在內(nèi)存中衬廷,在事務(wù)成功完成前仍有可能出現(xiàn)硬件故障摇予,事務(wù)仍有可能不得不中止。因此吗跋,部分提交狀態(tài)并不等于事務(wù)成功執(zhí)行趾盐。
3)失敗狀態(tài):由于硬件或邏輯等錯誤,使得事務(wù)不能繼續(xù)正常執(zhí)行小腊,事務(wù)就進(jìn)入了失敗狀態(tài)。處于失敗狀態(tài)的事務(wù)必須進(jìn)行回滾(ROLLBACK)久窟。這樣秩冈,事務(wù)就進(jìn)入了中止?fàn)顟B(tài)。
4)中止?fàn)顟B(tài):事務(wù)回滾并且數(shù)據(jù)庫恢復(fù)到事務(wù)開始執(zhí)行前的狀態(tài)斥扛。
5)提交狀態(tài):當(dāng)事務(wù)成功完成后入问,稱事務(wù)處于提交狀態(tài)丹锹。只有事務(wù)處于提交狀態(tài)后,才能說事務(wù)已經(jīng)提交芬失。
image.png - 事務(wù)進(jìn)入中止?fàn)顟B(tài)后楣黍,系統(tǒng)一般有如下兩種選擇:
1)重啟事務(wù):當(dāng)事務(wù)中止的原因是軟、硬件錯誤而不是事務(wù)內(nèi)部邏輯錯誤時棱烂,一般采用重啟事務(wù)的方法租漂。重啟事務(wù)可以被看成一個新事物
2)殺死事務(wù):這樣做通常是因?yàn)槭聞?wù)中止的原因是事務(wù)內(nèi)部的邏輯錯誤,或者是輸入錯誤颊糜,也可能是所需數(shù)據(jù)在數(shù)據(jù)庫中沒找到等原因
數(shù)據(jù)庫的并發(fā)控制
- 并發(fā)操作帶來的數(shù)據(jù)不一致性有三類:丟失修改哩治、不可重復(fù)讀、讀臟數(shù)據(jù)
- 排它鎖:也稱為寫鎖衬鱼,對數(shù)據(jù)進(jìn)行寫操作時進(jìn)行鎖定业筏,只允許對數(shù)據(jù)加鎖的事務(wù)進(jìn)行讀取與修改,其他事務(wù)不可讀也不可改鸟赫。
- 共享鎖:也成為讀鎖蒜胖,用于對數(shù)據(jù)進(jìn)行讀操作時鎖定,對數(shù)據(jù)進(jìn)行加鎖操作的事務(wù)只允許讀取不允許修改抛蚤,其他事務(wù)可以對該數(shù)據(jù)進(jìn)行加共享鎖操作台谢,不能進(jìn)行加排他鎖
- 封鎖協(xié)議:
1)一級鎖協(xié)議:事務(wù)T在修改數(shù)據(jù)A之前必須對A加X(排他)鎖,直至事務(wù)結(jié)束才能釋放X鎖霉颠。
2)二級鎖協(xié)議:是一級鎖協(xié)議記上事務(wù)T在讀取數(shù)據(jù)A之前必須對其加上S鎖对碌,讀完之后即可釋放S鎖。但釋放后有其他事務(wù)對A進(jìn)行修改蒿偎,事務(wù)T再次讀取A時朽们,就會出現(xiàn)不可重復(fù)讀的錯誤。
3)三級所協(xié)議:是一級鎖協(xié)議上加上事務(wù)T讀取A之前必須對A加上S鎖诉位,直到事務(wù)結(jié)束才釋放S鎖骑脱,解決不可重復(fù)讀的問題。
一級可以防止:丟失修改
二級可以防止:丟失修改和臟讀
三級可以防止:丟失修改苍糠、臟讀叁丧、不可重復(fù)讀
- 兩段鎖:是指對任何數(shù)據(jù)進(jìn)行讀寫之前都必須對數(shù)據(jù)進(jìn)行加鎖,在釋放一個封鎖前岳瞭,事務(wù)不在申請和獲得任何其他封鎖拥娄。兩段鎖的含義是指食物分為兩個階段,第一級階段是獲取鎖瞳筏,第二個階段是釋放鎖稚瘾。
- 兩段鎖協(xié)議與可串行化:如果事務(wù)遵循兩段鎖協(xié)議,那么他們的并發(fā)調(diào)度是可串行化的姚炕。
數(shù)據(jù)庫的備份恢復(fù)
數(shù)據(jù)庫備份
- 數(shù)據(jù)備份:數(shù)據(jù)轉(zhuǎn)儲時將數(shù)據(jù)庫自制到另一個磁盤或者磁帶上保存的過程
1)靜態(tài)轉(zhuǎn)存:轉(zhuǎn)儲期間不允許對數(shù)據(jù)庫進(jìn)行任何存取摊欠、修改操作
2)動態(tài)轉(zhuǎn)存:轉(zhuǎn)儲期間允許對數(shù)據(jù)庫進(jìn)行存取丢烘、修改操作,因此轉(zhuǎn)儲和用戶事務(wù)可并發(fā)執(zhí)行
3)海量轉(zhuǎn)存:指每次轉(zhuǎn)儲全部數(shù)據(jù)
4)增量轉(zhuǎn)存:每次只轉(zhuǎn)儲上次轉(zhuǎn)儲后更新過的數(shù)據(jù)
5)日志文件:在事務(wù)處理的過程中些椒,DBMS把事務(wù)開始播瞳、事務(wù)結(jié)束以及對數(shù)據(jù)庫的插入、刪除和修改的每一次操作寫入日志文件免糕,每條記錄主要內(nèi)容包括執(zhí)行操作的事務(wù)標(biāo)識赢乓、操作類型、更新前的數(shù)據(jù)舊值说墨、更新后的數(shù)據(jù)值骏全、更新日期和時間。一旦發(fā)生故障尼斧,數(shù)據(jù)庫的恢復(fù)子系統(tǒng)可以利用日志文件撤銷食物對數(shù)據(jù)庫的改變姜贡,回退到事務(wù)的初識狀態(tài)。
6)數(shù)據(jù)庫鏡像:為了避免磁盤介質(zhì)出現(xiàn)故障影響數(shù)據(jù)庫的可用性棺棵,許多DBMS提供數(shù)據(jù)庫鏡像功能用于數(shù)據(jù)庫恢復(fù)楼咳。
數(shù)據(jù)庫恢復(fù)
- 數(shù)據(jù)恢復(fù)的基本原理是冗余
- 故障恢復(fù)的兩個操作
1)撤銷事務(wù)(UNDO):將未完成的事務(wù)撤銷,使數(shù)據(jù)庫恢復(fù)到事務(wù)執(zhí)行前的正確狀態(tài)
撤銷事務(wù)的過程:
1)由后往前掃描找到未完成的事務(wù)日志烛恤,查找事務(wù)的更新操作
2)對該事務(wù)的更新操作執(zhí)行逆操作母怜,用日志文件記錄中更新前的值寫入數(shù)據(jù)庫,插入的記錄從數(shù)據(jù)庫中刪除缚柏,刪除的記錄重新插入數(shù)據(jù)庫苹熏,
3)繼續(xù)反向掃描日志文件,查找該事務(wù)的其他更新操作币喧,并執(zhí)行逆操作直至事務(wù)開始標(biāo)識
2)重做事務(wù)(REDO):將已提交的事務(wù)重新執(zhí)行
重做事務(wù)的過程:
從事務(wù)的開始標(biāo)識起轨域,正向掃描日志文件,重新執(zhí)行日志文件登記的該事務(wù)的所有對數(shù)據(jù)庫的操作杀餐,直至事務(wù)結(jié)束標(biāo)記
對于不同的故障干发,采用不同的恢復(fù)策略:
事務(wù)故障的恢復(fù):
1)事務(wù)故障定義(事務(wù)異常終止):由于程序執(zhí)行錯誤而引起食物非預(yù)期、異常終止的事務(wù)史翘。常見為邏輯錯誤枉长,如非法輸入、找不到數(shù)據(jù)琼讽、溢出等必峰;系統(tǒng)錯誤,系統(tǒng)進(jìn)入不良狀態(tài)如死鎖導(dǎo)致事務(wù)無法執(zhí)行钻蹬。事務(wù)故障主要靠數(shù)據(jù)庫自己進(jìn)行故障恢復(fù)自点,要在不影響其他事務(wù)運(yùn)行情況下,強(qiáng)行回滾該事務(wù)脉让,這類恢復(fù)操作成為事務(wù)撤銷(UNDO)桂敛。
2)事務(wù)故障恢復(fù):事務(wù)故障是事務(wù)執(zhí)行到至終點(diǎn)前異常結(jié)束,日志文件中只有開始標(biāo)識溅潜,因此需要執(zhí)行撤銷事務(wù)操作進(jìn)行恢復(fù)术唬。事務(wù)故障的恢復(fù)是由系統(tǒng)自動完成的,對用戶透明滚澜。
步驟1:反向掃描日志文件(即從最后向前掃描日志文件)粗仓,查找該事務(wù)的更新操作
步驟2:對事務(wù)的更新操作執(zhí)行逆操作
步驟3:繼續(xù)反向掃描日志文件,查找該事務(wù)的其他更新操作设捐,并做同樣的處理借浊,直到食物的開始標(biāo)志系統(tǒng)故障(內(nèi)存中數(shù)據(jù)丟失)的恢復(fù):
1)系統(tǒng)故障的定義:指硬件、軟件的漏洞影響萝招,導(dǎo)致丟失內(nèi)存中的信息蚂斤,影響正在執(zhí)行的事務(wù),但并未破壞外存上的信息槐沼,這種成為故障-停止假設(shè)(fail-stop assumption)曙蒸。系統(tǒng)故障終止了事務(wù)的執(zhí)行過程,破壞了事務(wù)的原子性岗钩,由于緩沖中的部分?jǐn)?shù)據(jù)可能已經(jīng)寫入數(shù)據(jù)庫纽窟,系統(tǒng)重啟后數(shù)據(jù)庫可能處于不一致狀態(tài)
2)系統(tǒng)故障恢復(fù):系統(tǒng)故障的原因有兩個,一是未完成的事務(wù)對數(shù)據(jù)庫的更新可能已經(jīng)寫入數(shù)據(jù)庫兼吓,而是已提交的事務(wù)對數(shù)據(jù)庫的更新可能還在緩沖區(qū)中未寫入數(shù)據(jù)庫臂港,因此需要對未完成的事務(wù)執(zhí)行撤銷事務(wù)操作,重做已提交事務(wù)介質(zhì)故障的恢復(fù):
1)介質(zhì)故障定義:指數(shù)據(jù)庫的存儲介質(zhì)發(fā)生故障视搏,如磁盤損壞审孽、瞬間強(qiáng)磁場干擾等,這種故障直接破壞了數(shù)據(jù)庫凶朗,會影響所有正在讀取這部分?jǐn)?shù)據(jù)的事務(wù)瓷胧。
2)介質(zhì)故障恢復(fù):介質(zhì)故障時數(shù)據(jù)庫遭到破壞,需要重裝數(shù)據(jù)庫棚愤,裝載故障前最近一次的備份和故障前的日志文件副本搓萧,在按照系統(tǒng)故障的恢復(fù)過程執(zhí)行撤銷和重做來恢復(fù)。