版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第19章數(shù)據(jù)一致性與事務管理數(shù)據(jù)庫中,除了數(shù)據(jù)的完整性之外,數(shù)據(jù)的一致性同樣是一個重要的話題。而事務是保證數(shù)據(jù)一致性的重要手段。本章主要講解數(shù)據(jù)的一致性,以及事務的管理。本章的主要內容包括:數(shù)據(jù)一致性簡介;事務簡介;Oracle中的事務處理;事務處理的原則。19.1什么是數(shù)據(jù)一致性和事務數(shù)據(jù)一致性是指數(shù)據(jù)庫的數(shù)據(jù)在每一時刻都是穩(wěn)定、而且是可靠的狀態(tài)。而事務是保證數(shù)據(jù)一致性的主要手段。19.1.1數(shù)據(jù)一致性對于一個數(shù)據(jù)庫來說,其中的數(shù)據(jù)可能是每時每刻都在發(fā)生著變化,而在數(shù)據(jù)變化的同時,也無時無刻不伴隨著數(shù)據(jù)的讀取。這就對數(shù)據(jù)庫的狀態(tài)產生了比較高的要求——數(shù)據(jù)庫的每次改變都是可被接受的,而每次讀取的數(shù)據(jù)也都是正常的。這就是數(shù)據(jù)一致性的體現(xiàn)。例如,在某個用戶的銀行賬戶中,現(xiàn)有存款100元。此時,如果一個用戶讀取其中的數(shù)據(jù)為100元,那么,此時的100元是可以接受的數(shù)據(jù)。但在同一時刻,另一用戶針對同一賬戶進行了以下操作,向其中存入了100元,但是還沒有提交動作,那么,此時第一個用戶有可能會讀到200元的余額。事實上,由于某些原因,第二個用戶的提交沒有成功,那么第一個用戶所讀取的200元,并非數(shù)據(jù)庫的真實和可靠的狀態(tài)。這就造成了讀不一致性。另外一種情形,如果第一個用戶讀取了200元的同時,取出了100元,那么計算獲得余額為100元。而第二個用戶的存款動作失敗,最后,第一個用戶的余額重新覆蓋數(shù)據(jù)庫中的數(shù)據(jù),那么就會將100再次寫回數(shù)據(jù)庫,這造成了取出100元,最后余額還為100元的狀態(tài),此時的數(shù)據(jù)庫也不符合一致性的狀態(tài)。19.1.2事務在數(shù)據(jù)庫中,提出了事務的概念來保證數(shù)據(jù)庫中數(shù)據(jù)的一致性。事務往往包括一個或多個處理步驟。例如,在超市購物包括,選購商品、放入購物車、付款、個人現(xiàn)金或銀行賬戶余額減少、超市賬戶余額增加、商品庫中商品信息更新等步驟。這些步驟組成了一個事務,當其中任何步驟出現(xiàn)異常,并且不能正常進行下去,都會影響其他所有步驟。例如,付款階段不能正常進行,那么將不會對個人的現(xiàn)金或銀行賬戶造成影響,超市的賬戶也不可能進行余額的增加,商品庫中也不能更新該商品的信息。同樣的,如果個人現(xiàn)金或賬戶余額不足,那么也無法完成整個交易。在此之前所做的所有動作:選購商品、放入購物車等都將無效,商品應當被重新放回貨架。19.2Oracle中的事務處理Oracle中的事務應當使用關鍵字transaction。一個事務的生命周期應當包括:事務開始、事務執(zhí)行和事務結束。需要注意的是,Oracle中并不能顯式開始一個事務,也不存在這樣的語句。事務的開始總是隱式進行的,而事務的結束則可以利用commit或者rollback命令進行終止。Oracle中控制事務的常用命令包括:Commit;rollback;savepoint;rollbackto<savepoint>;settransaction;setconstraint。19.2.1commit命令commit命令用于提交事務,并將事務中對數(shù)據(jù)庫的修改進行持久化,即將數(shù)據(jù)庫修改為另外一種狀態(tài),而這種狀態(tài)是可接受的、可靠的狀態(tài)。whilei<1000loopupdatepeoplesetsalary=salary+10*iwhereid=i;i:=i+1;endloop;commit;對于開發(fā)者來說,最安全的方式是顯式進行數(shù)據(jù)的提交或者回滾,以結束事務。但很多時候,許多開發(fā)者并未注意該問題,而是依靠開發(fā)工具來進行提交或回滾。
此時需要注意的是,如果用戶未提交對數(shù)據(jù)庫的修改,而關閉了回話,或者數(shù)據(jù)庫連接在提交之前斷開,那么針對該數(shù)據(jù)庫的所有操作都將執(zhí)行回滾操作。19.2.1commit命令另外,需要明確的概念是,在提交之前,數(shù)據(jù)庫已經進行了實際更新,不過,并未得到數(shù)據(jù)庫認可,因此提交動作只是一個獲得認可的過程,其花費的數(shù)據(jù)庫資源非常少。而且,提交一條數(shù)據(jù)與提交1000條數(shù)據(jù)所花費的數(shù)據(jù)庫資源是相同的。因此,當實現(xiàn)大數(shù)據(jù)量的數(shù)據(jù)修改或者插入操作時,應當采取最后一次性提交的策略。whilei<1000loopupdatepeoplesetsalary=salary+10*iwhereid=i;i:=i+1;commit;endloop;在該代碼片段中,每次更新數(shù)據(jù),都有一次提交動作,將造成數(shù)據(jù)庫資源的浪費。
19.2.2rollback命令rollback命令用于回滾用戶操作。在某些時機,例如程序代碼段中出現(xiàn)異?;蝈e誤,或者用戶直接發(fā)出撤銷命令,需要回滾操作?;貪L操作將終止事務處理,并撤銷用戶在當前事務中進行的更改。beginwhilei<1000loopupdatepeoplesetsalary=salary+10*iwhereid=i;i:=i+1;endloop;exceptionrollback;end;回滾操作,首先要讀取回滾段信息,并利用這些信息將數(shù)據(jù)庫中已發(fā)生的修改重新恢復。例如,對于使用了update操作的列,則需要將其恢復到原值,而使用了delete操作的行,則需要再次執(zhí)行插入操作。因此,回滾操作所需要的時間和花費的資源,依賴于在事務中所執(zhí)行的數(shù)據(jù)庫更改,并與之成正比。通常情況下,回滾操作是非常耗費時間和資源的,因此,回滾往往被用于處理異常,而不用作終端用戶的可操作選項。一旦終端用戶經常性使用回滾操作,那么將為數(shù)據(jù)庫帶來非常大的負擔。應當保證終端用戶在提交事務之前進行確認,來代替允許用戶執(zhí)行回滾,從而實現(xiàn)提交與回滾操作的平衡。19.2.3savepoint和rollbacktosavepoint命令通過對rollback的描述可知,rollback命令走向了一個極端——回滾整個事務的所有操作。而有時,大部分的工作都是必須執(zhí)行的,僅有少量的工作有可能出現(xiàn)異常,并需要回滾。那么,除了利用多個事務進行處理之外,還可以使用savepoint在事務中建立標記點,并允許用戶只回滾標記點之后的動作?;貪L標記點之后的操作,需要使用rollbacktosavepoint命令。updatepeoplesetid=id-1;beginsavepointinsert_people;updatepeoplesetstatus='CXL';insertintopeople(id,name,status)values(1,'allen','ACT');exceptionwhenothersthenrollbacktoinsert_people;end;19.2.3savepoint和rollbacktosavepoint命令這里需要注意的是,回滾操作雖然回滾了數(shù)據(jù)庫狀態(tài),但是并不會改變程序的運行軌跡,也就是說,程序繼續(xù)執(zhí)行rollbacktoinsert_people的下一條語句。
updatepeoplesetid=id-1;beginsavepointinsert_people;updatepeoplesetstaus='CXL';insertintopeople(id,name,status)values(2,'allen','ACT');exceptionwhenothersthenrollbacktoinsert_people;end;commit;19.2.4事務的屬性和隔離級別事務本身存在著一些屬性,這可以保證事務以某種特定的規(guī)則運行。所謂隔離,是指將事務所能看到的數(shù)據(jù)庫狀態(tài)與其他事務分隔開來1.readonly屬性settransactionreadonly;insertintopeople(id,name,status)values(13,'youyou','ACT');commit;只讀事務的這種特性,可以提供一種穩(wěn)定的狀態(tài),從而處理大量的數(shù)據(jù)查詢工作。例如,在生成復雜報表時,需要查詢大量數(shù)據(jù),而這些數(shù)據(jù)又是頻繁變更的,在處理報表的過程中,可以利用只讀事務來提供穩(wěn)定的環(huán)境,以使生成的報表有意義。19.2.4事務的屬性和隔離級別2.readwrite屬性readwrite屬性可以將事務設置為可讀、可寫狀態(tài)。這實際是事務的默認狀態(tài),因此,該屬性的顯式設定,并沒有太大的現(xiàn)實意義。需要注意的是,一旦使用settransactionreadwrite命令,那么該命令之前,不能出現(xiàn)settransaction命令之外的其他命令。19.2.4事務的屬性和隔離級別3.serializable隔離級別serializable隔離級別是指串行化事務。串行化事務可以實現(xiàn)與只讀事務實現(xiàn)相同的功能——隔離其他事務對數(shù)據(jù)庫狀態(tài)的影響。但是串行化事務允許在其中執(zhí)行任何DML操作,包括刪除、修改、插入數(shù)據(jù)等。在默認情況下,一個事務可以識別其他事務針對數(shù)據(jù)庫的修改,而這種修改僅限于已經提交到數(shù)據(jù)庫的修改。使用了串行化事務,那么,其他事務已經提交的修改也將被隔離。這里所說的隔離,實際是對于查詢操作來說,也就是串行化事務的處理過程中,無法查看到其他事務的修改。settransactionisolationlevelserializable;19.2.4事務的屬性和隔離級別4.readcommited隔離級別readcommited隔離級別是事務的默認隔離級別,即只能讀取其他事務已經提交的修改。對于尚未提交的修改,只有實現(xiàn)該修改的事務本身可以進行讀取。19.3事務處理原則事務處理的原則可以概括為ACID。ACID是以下單詞的首字母:原子性(Atomicity):整個事務不可分割,要么全部執(zhí)行,要么都不執(zhí)行。一致性(Consistency):事務一旦提交生效,會將數(shù)據(jù)庫從一種狀態(tài)轉變?yōu)榱硪环N狀態(tài)。隔離性(Isolation)隔離性(Isolation):
在事務處理的過程中,事務處理的效果對于其他事務,是完全透明的。持久性(Durablity):一旦提交了事務處理,那么事務處理的效果將永久生效。19.3.1原子性Oracle中的事務處理遵循原子性。無論事務中包含多少語句,要么提交所有工作,要么廢除所有工作。需要注意的是,利用savepoint和rollbacksavepoint回滾部分操作并非特例,這是因為利用rollbacksavepoint也是用戶指定的動作??梢钥醋鍪聞仗幚碇械钠胀?。createtablet(datavarchar2(2));insertintotvalues('a');insertintotvalues('b');Rollback;select*fromt;19.3.2一致性Oracle中的事務必須保證數(shù)據(jù)的一致性。數(shù)據(jù)一致性的一個典型實例為外鍵約束。例如,在外鍵約束時,首先更新父表中的主鍵,如果在子表中有數(shù)據(jù)與該父表記錄相關聯(lián),那么父表的更新將被終止。同樣地,如果試圖更新子表的外鍵列,也會造成更新失敗。因為這兩個動作都破壞了數(shù)據(jù)的一致性。無論哪種操作,如果成功執(zhí)行,都會使數(shù)據(jù)庫中的數(shù)據(jù)處于邏輯上的不可接受狀態(tài)。此時的數(shù)據(jù)一致性的保持,是在出現(xiàn)在語句級,即每條DML語句都會進行校驗。而事務可以包含多條語句,并可以在事務開始執(zhí)行時將約束設置為延遲校驗。以外鍵約束為例,可以成功避開無法更新父表主鍵和子表外鍵的尷尬。但是,提交時,延遲校驗將生效,以保持數(shù)據(jù)一致性。19.3.2一致性createtablevendor(vendor_idintegerprimarykey,vendor_namevarchar2(20));createtablepo(po_idinteger,vendor_idinteger,constraintfk_vendor_poforeignkey(vendor_id)referencesvendordeferrable);insertintovendorvalues(1,'HK');insertintopovalues(1,1);updatevendorsetvendor_id=2;setconstraintsfk_vendor_podeferred;updatevendorsetvendor_id=2;updateposetvendor_id=2;
commit;19.3.3隔離性1.臟讀取(DirtyRead)臟讀取意味著,可以讀取來自外界其他動作對數(shù)據(jù)庫的修改,而這種修改尚未提交,未提交的數(shù)據(jù)有可能回滾。也就是說,讀取的數(shù)據(jù)并非真正有效的數(shù)據(jù),這將直接破壞數(shù)據(jù)一致性。2.不可重讀不可重讀意味著,如果用戶在某一時刻讀取了一條記錄,那么,在下一時刻再次讀取時,該記錄已發(fā)生改變。其狀態(tài)類似于“人不能兩次踏入同一條河流”。不可重讀并非不可接受的,相反,不可重讀是一種正常的數(shù)據(jù)庫狀態(tài)。這與臟讀取是有本質區(qū)別的。3.影像讀取影像讀取意味著,如果用戶在某一時刻執(zhí)行了一個查詢,在下一時刻再次執(zhí)行相同查詢時,可能會有新的數(shù)據(jù)加入。但是,已經讀取的數(shù)據(jù)是不會改變的,只是查詢所獲得結果集更大而已。19.3.4持久性持久性是指,當事務一旦提交,其改變將會生效,并將信息存儲在磁盤上。當系統(tǒng)再次重新啟動或者故障時,這些信息不會丟失。對于提交動作來說,用戶見到提交成功提示時,Oracle并未完成持久化工作。但是,Oracle數(shù)據(jù)庫利用redo日志文件來保證系統(tǒng)的持久性。redo文件在事務提交的前一刻生成,其中記錄了一旦提交時,系統(tǒng)崩潰,那么該如何將事務的工作再次執(zhí)行,以保證事務真正執(zhí)行完畢,并持久化到數(shù)據(jù)庫。19.4本章實例本節(jié)將通過一個實例查看事務嵌套的處理原則。事務嵌套是指,在事務的處理過程中調用了其他子程序,子程序所完成的功能也是一個事物?!痉独?9-12】該范例用于演示事務嵌套的處理原則。createtablerecords(recordvarchar2(20));createorreplaceprocedurelocaliscounternumber:=-1;beginselectcount(*)intocounterfromrecords;dbms_output.put_line('子程序,當前記錄數(shù)為:'||counter);insertintorecordsvalues('該記錄來自local');commit;end;19.4本章實例declarecounternumber:=-1;begindeletefromrecords;commit;insertintorecordsvalues('該記錄來自Global');local;selectcount(*)intocounterfromrecords;dbms_output.put_line('主程序,當前記錄數(shù)為:'||counter);rollback;
local;insertintorecordsvalues('該記錄來自Gobal');commit;
local;selectcount(*)intocounterfromrecords;dbms_output.put_line('主程序,當前記錄數(shù)為:'||counter);end;19.4本章實例declarecounternumber:=-1;begindeletefromrecords;commit;insertintorecordsvalues('該記錄來自Global');lo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電商企業(yè)運營專員聘用合同樣本
- 住宅區(qū)雞舍建設合同
- 建筑工程拆遷施工合同范本
- 水上運輸水車租賃合同
- 箱包加工合同書
- 全面質量管理質量管理辦法
- 智能交通系統(tǒng)招投標申請表
- 租賃設備合同修改
- 保健用品行業(yè)售后服務管理規(guī)范
- 商業(yè)建筑電氣安裝合同
- 整式知識點總結
- 《制作洋蔥表皮細胞臨時裝片》教學設計
- 總公司與分公司合并報表編制舉例
- 錦綸染色過程的問題與解決方法
- 土地租金發(fā)放表
- 醫(yī)院水電安裝施工方案
- 計算機網絡考試重點整理
- 北師大版數(shù)學八上4.3.1《正比例函數(shù)的圖像與性質》(22張).ppt課件
- 高一物理的必修的一期中考試試卷解析告
- 頻譜分析與處理PPT課件
- 校園放心食品安全工程A級示范食堂量化評定標準
評論
0/150
提交評論