數(shù)據(jù)一致性與事務(wù)管理_第1頁(yè)
數(shù)據(jù)一致性與事務(wù)管理_第2頁(yè)
數(shù)據(jù)一致性與事務(wù)管理_第3頁(yè)
數(shù)據(jù)一致性與事務(wù)管理_第4頁(yè)
數(shù)據(jù)一致性與事務(wù)管理_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第19章數(shù)據(jù)一致性與事務(wù)管理數(shù)據(jù)庫(kù)中,除了數(shù)據(jù)的完整性之外,數(shù)據(jù)的一致性同樣是一個(gè)重要的話(huà)題。而事務(wù)是保證數(shù)據(jù)一致性的重要手段。本章主要講解數(shù)據(jù)的一致性,以及事務(wù)的管理。本章的主要內(nèi)容包括:數(shù)據(jù)一致性簡(jiǎn)介;事務(wù)簡(jiǎn)介;Oracle中的事務(wù)處理;事務(wù)處理的原則。19.1什么是數(shù)據(jù)一致性和事務(wù)數(shù)據(jù)一致性是指數(shù)據(jù)庫(kù)的數(shù)據(jù)在每一時(shí)刻都是穩(wěn)定、而且是可靠的狀態(tài)。而事務(wù)是保證數(shù)據(jù)一致性的主要手段。19.1.1數(shù)據(jù)一致性對(duì)于一個(gè)數(shù)據(jù)庫(kù)來(lái)說(shuō),其中的數(shù)據(jù)可能是每時(shí)每刻都在發(fā)生著變化,而在數(shù)據(jù)變化的同時(shí),也無(wú)時(shí)無(wú)刻不伴隨著數(shù)據(jù)的讀取。這就對(duì)數(shù)據(jù)庫(kù)的狀態(tài)產(chǎn)生了比較高的要求——數(shù)據(jù)庫(kù)的每次改變都是可被接受的,而每次讀取的數(shù)據(jù)也都是正常的。這就是數(shù)據(jù)一致性的體現(xiàn)。例如,在某個(gè)用戶(hù)的銀行賬戶(hù)中,現(xiàn)有存款100元。此時(shí),如果一個(gè)用戶(hù)讀取其中的數(shù)據(jù)為100元,那么,此時(shí)的100元是可以接受的數(shù)據(jù)。但在同一時(shí)刻,另一用戶(hù)針對(duì)同一賬戶(hù)進(jìn)行了以下操作,向其中存入了100元,但是還沒(méi)有提交動(dòng)作,那么,此時(shí)第一個(gè)用戶(hù)有可能會(huì)讀到200元的余額。事實(shí)上,由于某些原因,第二個(gè)用戶(hù)的提交沒(méi)有成功,那么第一個(gè)用戶(hù)所讀取的200元,并非數(shù)據(jù)庫(kù)的真實(shí)和可靠的狀態(tài)。這就造成了讀不一致性。另外一種情形,如果第一個(gè)用戶(hù)讀取了200元的同時(shí),取出了100元,那么計(jì)算獲得余額為100元。而第二個(gè)用戶(hù)的存款動(dòng)作失敗,最后,第一個(gè)用戶(hù)的余額重新覆蓋數(shù)據(jù)庫(kù)中的數(shù)據(jù),那么就會(huì)將100再次寫(xiě)回?cái)?shù)據(jù)庫(kù),這造成了取出100元,最后余額還為100元的狀態(tài),此時(shí)的數(shù)據(jù)庫(kù)也不符合一致性的狀態(tài)。19.1.2事務(wù)在數(shù)據(jù)庫(kù)中,提出了事務(wù)的概念來(lái)保證數(shù)據(jù)庫(kù)中數(shù)據(jù)的一致性。事務(wù)往往包括一個(gè)或多個(gè)處理步驟。例如,在超市購(gòu)物包括,選購(gòu)商品、放入購(gòu)物車(chē)、付款、個(gè)人現(xiàn)金或銀行賬戶(hù)余額減少、超市賬戶(hù)余額增加、商品庫(kù)中商品信息更新等步驟。這些步驟組成了一個(gè)事務(wù),當(dāng)其中任何步驟出現(xiàn)異常,并且不能正常進(jìn)行下去,都會(huì)影響其他所有步驟。例如,付款階段不能正常進(jìn)行,那么將不會(huì)對(duì)個(gè)人的現(xiàn)金或銀行賬戶(hù)造成影響,超市的賬戶(hù)也不可能進(jìn)行余額的增加,商品庫(kù)中也不能更新該商品的信息。同樣的,如果個(gè)人現(xiàn)金或賬戶(hù)余額不足,那么也無(wú)法完成整個(gè)交易。在此之前所做的所有動(dòng)作:選購(gòu)商品、放入購(gòu)物車(chē)等都將無(wú)效,商品應(yīng)當(dāng)被重新放回貨架。19.2Oracle中的事務(wù)處理Oracle中的事務(wù)應(yīng)當(dāng)使用關(guān)鍵字transaction。一個(gè)事務(wù)的生命周期應(yīng)當(dāng)包括:事務(wù)開(kāi)始、事務(wù)執(zhí)行和事務(wù)結(jié)束。需要注意的是,Oracle中并不能顯式開(kāi)始一個(gè)事務(wù),也不存在這樣的語(yǔ)句。事務(wù)的開(kāi)始總是隱式進(jìn)行的,而事務(wù)的結(jié)束則可以利用commit或者rollback命令進(jìn)行終止。Oracle中控制事務(wù)的常用命令包括:Commit;rollback;savepoint;rollbackto<savepoint>;settransaction;setconstraint。19.2.1commit命令commit命令用于提交事務(wù),并將事務(wù)中對(duì)數(shù)據(jù)庫(kù)的修改進(jìn)行持久化,即將數(shù)據(jù)庫(kù)修改為另外一種狀態(tài),而這種狀態(tài)是可接受的、可靠的狀態(tài)。whilei<1000loopupdatepeoplesetsalary=salary+10*iwhereid=i;i:=i+1;endloop;commit;對(duì)于開(kāi)發(fā)者來(lái)說(shuō),最安全的方式是顯式進(jìn)行數(shù)據(jù)的提交或者回滾,以結(jié)束事務(wù)。但很多時(shí)候,許多開(kāi)發(fā)者并未注意該問(wèn)題,而是依靠開(kāi)發(fā)工具來(lái)進(jìn)行提交或回滾。

此時(shí)需要注意的是,如果用戶(hù)未提交對(duì)數(shù)據(jù)庫(kù)的修改,而關(guān)閉了回話(huà),或者數(shù)據(jù)庫(kù)連接在提交之前斷開(kāi),那么針對(duì)該數(shù)據(jù)庫(kù)的所有操作都將執(zhí)行回滾操作。19.2.1commit命令另外,需要明確的概念是,在提交之前,數(shù)據(jù)庫(kù)已經(jīng)進(jìn)行了實(shí)際更新,不過(guò),并未得到數(shù)據(jù)庫(kù)認(rèn)可,因此提交動(dòng)作只是一個(gè)獲得認(rèn)可的過(guò)程,其花費(fèi)的數(shù)據(jù)庫(kù)資源非常少。而且,提交一條數(shù)據(jù)與提交1000條數(shù)據(jù)所花費(fèi)的數(shù)據(jù)庫(kù)資源是相同的。因此,當(dāng)實(shí)現(xiàn)大數(shù)據(jù)量的數(shù)據(jù)修改或者插入操作時(shí),應(yīng)當(dāng)采取最后一次性提交的策略。whilei<1000loopupdatepeoplesetsalary=salary+10*iwhereid=i;i:=i+1;commit;endloop;在該代碼片段中,每次更新數(shù)據(jù),都有一次提交動(dòng)作,將造成數(shù)據(jù)庫(kù)資源的浪費(fèi)。

19.2.2rollback命令rollback命令用于回滾用戶(hù)操作。在某些時(shí)機(jī),例如程序代碼段中出現(xiàn)異?;蝈e(cuò)誤,或者用戶(hù)直接發(fā)出撤銷(xiāo)命令,需要回滾操作?;貪L操作將終止事務(wù)處理,并撤銷(xiāo)用戶(hù)在當(dāng)前事務(wù)中進(jìn)行的更改。beginwhilei<1000loopupdatepeoplesetsalary=salary+10*iwhereid=i;i:=i+1;endloop;exceptionrollback;end;回滾操作,首先要讀取回滾段信息,并利用這些信息將數(shù)據(jù)庫(kù)中已發(fā)生的修改重新恢復(fù)。例如,對(duì)于使用了update操作的列,則需要將其恢復(fù)到原值,而使用了delete操作的行,則需要再次執(zhí)行插入操作。因此,回滾操作所需要的時(shí)間和花費(fèi)的資源,依賴(lài)于在事務(wù)中所執(zhí)行的數(shù)據(jù)庫(kù)更改,并與之成正比。通常情況下,回滾操作是非常耗費(fèi)時(shí)間和資源的,因此,回滾往往被用于處理異常,而不用作終端用戶(hù)的可操作選項(xiàng)。一旦終端用戶(hù)經(jīng)常性使用回滾操作,那么將為數(shù)據(jù)庫(kù)帶來(lái)非常大的負(fù)擔(dān)。應(yīng)當(dāng)保證終端用戶(hù)在提交事務(wù)之前進(jìn)行確認(rèn),來(lái)代替允許用戶(hù)執(zhí)行回滾,從而實(shí)現(xiàn)提交與回滾操作的平衡。19.2.3savepoint和rollbacktosavepoint命令通過(guò)對(duì)rollback的描述可知,rollback命令走向了一個(gè)極端——回滾整個(gè)事務(wù)的所有操作。而有時(shí),大部分的工作都是必須執(zhí)行的,僅有少量的工作有可能出現(xiàn)異常,并需要回滾。那么,除了利用多個(gè)事務(wù)進(jìn)行處理之外,還可以使用savepoint在事務(wù)中建立標(biāo)記點(diǎn),并允許用戶(hù)只回滾標(biāo)記點(diǎn)之后的動(dòng)作。回滾標(biāo)記點(diǎn)之后的操作,需要使用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ù)庫(kù)狀態(tài),但是并不會(huì)改變程序的運(yùn)行軌跡,也就是說(shuō),程序繼續(xù)執(zhí)行rollbacktoinsert_people的下一條語(yǔ)句。

updatepeoplesetid=id-1;beginsavepointinsert_people;updatepeoplesetstaus='CXL';insertintopeople(id,name,status)values(2,'allen','ACT');exceptionwhenothersthenrollbacktoinsert_people;end;commit;19.2.4事務(wù)的屬性和隔離級(jí)別事務(wù)本身存在著一些屬性,這可以保證事務(wù)以某種特定的規(guī)則運(yùn)行。所謂隔離,是指將事務(wù)所能看到的數(shù)據(jù)庫(kù)狀態(tài)與其他事務(wù)分隔開(kāi)來(lái)1.readonly屬性settransactionreadonly;insertintopeople(id,name,status)values(13,'youyou','ACT');commit;只讀事務(wù)的這種特性,可以提供一種穩(wěn)定的狀態(tài),從而處理大量的數(shù)據(jù)查詢(xún)工作。例如,在生成復(fù)雜報(bào)表時(shí),需要查詢(xún)大量數(shù)據(jù),而這些數(shù)據(jù)又是頻繁變更的,在處理報(bào)表的過(guò)程中,可以利用只讀事務(wù)來(lái)提供穩(wěn)定的環(huán)境,以使生成的報(bào)表有意義。19.2.4事務(wù)的屬性和隔離級(jí)別2.readwrite屬性readwrite屬性可以將事務(wù)設(shè)置為可讀、可寫(xiě)狀態(tài)。這實(shí)際是事務(wù)的默認(rèn)狀態(tài),因此,該屬性的顯式設(shè)定,并沒(méi)有太大的現(xiàn)實(shí)意義。需要注意的是,一旦使用settransactionreadwrite命令,那么該命令之前,不能出現(xiàn)settransaction命令之外的其他命令。19.2.4事務(wù)的屬性和隔離級(jí)別3.serializable隔離級(jí)別serializable隔離級(jí)別是指串行化事務(wù)。串行化事務(wù)可以實(shí)現(xiàn)與只讀事務(wù)實(shí)現(xiàn)相同的功能——隔離其他事務(wù)對(duì)數(shù)據(jù)庫(kù)狀態(tài)的影響。但是串行化事務(wù)允許在其中執(zhí)行任何DML操作,包括刪除、修改、插入數(shù)據(jù)等。在默認(rèn)情況下,一個(gè)事務(wù)可以識(shí)別其他事務(wù)針對(duì)數(shù)據(jù)庫(kù)的修改,而這種修改僅限于已經(jīng)提交到數(shù)據(jù)庫(kù)的修改。使用了串行化事務(wù),那么,其他事務(wù)已經(jīng)提交的修改也將被隔離。這里所說(shuō)的隔離,實(shí)際是對(duì)于查詢(xún)操作來(lái)說(shuō),也就是串行化事務(wù)的處理過(guò)程中,無(wú)法查看到其他事務(wù)的修改。settransactionisolationlevelserializable;19.2.4事務(wù)的屬性和隔離級(jí)別4.readcommited隔離級(jí)別readcommited隔離級(jí)別是事務(wù)的默認(rèn)隔離級(jí)別,即只能讀取其他事務(wù)已經(jīng)提交的修改。對(duì)于尚未提交的修改,只有實(shí)現(xiàn)該修改的事務(wù)本身可以進(jìn)行讀取。19.3事務(wù)處理原則事務(wù)處理的原則可以概括為ACID。ACID是以下單詞的首字母:原子性(Atomicity):整個(gè)事務(wù)不可分割,要么全部執(zhí)行,要么都不執(zhí)行。一致性(Consistency):事務(wù)一旦提交生效,會(huì)將數(shù)據(jù)庫(kù)從一種狀態(tài)轉(zhuǎn)變?yōu)榱硪环N狀態(tài)。隔離性(Isolation)隔離性(Isolation):

在事務(wù)處理的過(guò)程中,事務(wù)處理的效果對(duì)于其他事務(wù),是完全透明的。持久性(Durablity):一旦提交了事務(wù)處理,那么事務(wù)處理的效果將永久生效。19.3.1原子性O(shè)racle中的事務(wù)處理遵循原子性。無(wú)論事務(wù)中包含多少語(yǔ)句,要么提交所有工作,要么廢除所有工作。需要注意的是,利用savepoint和rollbacksavepoint回滾部分操作并非特例,這是因?yàn)槔胷ollbacksavepoint也是用戶(hù)指定的動(dòng)作??梢钥醋鍪聞?wù)處理中的普通命令。createtablet(datavarchar2(2));insertintotvalues('a');insertintotvalues('b');Rollback;select*fromt;19.3.2一致性O(shè)racle中的事務(wù)必須保證數(shù)據(jù)的一致性。數(shù)據(jù)一致性的一個(gè)典型實(shí)例為外鍵約束。例如,在外鍵約束時(shí),首先更新父表中的主鍵,如果在子表中有數(shù)據(jù)與該父表記錄相關(guān)聯(lián),那么父表的更新將被終止。同樣地,如果試圖更新子表的外鍵列,也會(huì)造成更新失敗。因?yàn)檫@兩個(gè)動(dòng)作都破壞了數(shù)據(jù)的一致性。無(wú)論哪種操作,如果成功執(zhí)行,都會(huì)使數(shù)據(jù)庫(kù)中的數(shù)據(jù)處于邏輯上的不可接受狀態(tài)。此時(shí)的數(shù)據(jù)一致性的保持,是在出現(xiàn)在語(yǔ)句級(jí),即每條DML語(yǔ)句都會(huì)進(jìn)行校驗(yàn)。而事務(wù)可以包含多條語(yǔ)句,并可以在事務(wù)開(kāi)始執(zhí)行時(shí)將約束設(shè)置為延遲校驗(yàn)。以外鍵約束為例,可以成功避開(kāi)無(wú)法更新父表主鍵和子表外鍵的尷尬。但是,提交時(shí),延遲校驗(yàn)將生效,以保持?jǐn)?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)臟讀取意味著,可以讀取來(lái)自外界其他動(dòng)作對(duì)數(shù)據(jù)庫(kù)的修改,而這種修改尚未提交,未提交的數(shù)據(jù)有可能回滾。也就是說(shuō),讀取的數(shù)據(jù)并非真正有效的數(shù)據(jù),這將直接破壞數(shù)據(jù)一致性。2.不可重讀不可重讀意味著,如果用戶(hù)在某一時(shí)刻讀取了一條記錄,那么,在下一時(shí)刻再次讀取時(shí),該記錄已發(fā)生改變。其狀態(tài)類(lèi)似于“人不能兩次踏入同一條河流”。不可重讀并非不可接受的,相反,不可重讀是一種正常的數(shù)據(jù)庫(kù)狀態(tài)。這與臟讀取是有本質(zhì)區(qū)別的。3.影像讀取影像讀取意味著,如果用戶(hù)在某一時(shí)刻執(zhí)行了一個(gè)查詢(xún),在下一時(shí)刻再次執(zhí)行相同查詢(xún)時(shí),可能會(huì)有新的數(shù)據(jù)加入。但是,已經(jīng)讀取的數(shù)據(jù)是不會(huì)改變的,只是查詢(xún)所獲得結(jié)果集更大而已。19.3.4持久性持久性是指,當(dāng)事務(wù)一旦提交,其改變將會(huì)生效,并將信息存儲(chǔ)在磁盤(pán)上。當(dāng)系統(tǒng)再次重新啟動(dòng)或者故障時(shí),這些信息不會(huì)丟失。對(duì)于提交動(dòng)作來(lái)說(shuō),用戶(hù)見(jiàn)到提交成功提示時(shí),Oracle并未完成持久化工作。但是,Oracle數(shù)據(jù)庫(kù)利用redo日志文件來(lái)保證系統(tǒng)的持久性。redo文件在事務(wù)提交的前一刻生成,其中記錄了一旦提交時(shí),系統(tǒng)崩潰,那么該如何將事務(wù)的工作再次執(zhí)行,以保證事務(wù)真正執(zhí)行完畢,并持久化到數(shù)據(jù)庫(kù)。19.4本章實(shí)例本節(jié)將通過(guò)一個(gè)實(shí)例查看事務(wù)嵌套的處理原則。事務(wù)嵌套是指,在事務(wù)的處理過(guò)程中調(diào)用了其他子程序,子程序所完成的功能也是一個(gè)事物?!痉独?9-12】該范例用于演示事務(wù)嵌套的處理原則。createtablerecords(recordvarchar2(20));createorreplaceprocedurelocaliscounternumber:=-1;beginselectcount(*)intocounterfromrecords;dbms_output.put_line('子程序,當(dāng)前記錄數(shù)為:'||counter);insertintorecordsvalues('該記錄來(lái)自local');commit;end;19.4本章實(shí)例declarecounternumber:=-1;begindeletefromrecords;commit;insertintorecordsvalues('該記錄來(lái)自Global');local;selectcount(*)intocounterfromrecords;dbms_output.put_line('主程序,當(dāng)前記錄數(shù)為:'||counter);rollback;

local;insertintorecordsvalues('該記錄來(lái)自Gobal');commit;

local;selectcount(*)intocounterfromrecords;dbms_output.put_line('主程序,當(dāng)前記錄數(shù)為:'||counter);end;19.4本章實(shí)例declarecounternumber:=-1;begindeletefromrecords;commit;insertintorecordsvalues('該記錄來(lái)自Global');lo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論