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

下載本文檔

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

文檔簡介

1、第第1919章章 數(shù)據(jù)一致性與事務(wù)管理數(shù)據(jù)一致性與事務(wù)管理數(shù)據(jù)庫中,除了數(shù)據(jù)的完整性之外,數(shù)據(jù)的一致性同數(shù)據(jù)庫中,除了數(shù)據(jù)的完整性之外,數(shù)據(jù)的一致性同樣是一個重要的話題。而事務(wù)是保證數(shù)據(jù)一致性的重要手段樣是一個重要的話題。而事務(wù)是保證數(shù)據(jù)一致性的重要手段。本章主要講解數(shù)據(jù)的一致性,以及事務(wù)的管理。本章的主。本章主要講解數(shù)據(jù)的一致性,以及事務(wù)的管理。本章的主要內(nèi)容包括:要內(nèi)容包括:l數(shù)據(jù)一致性簡介;數(shù)據(jù)一致性簡介;l事務(wù)簡介;事務(wù)簡介;lOracle中的事務(wù)處理;中的事務(wù)處理;l事務(wù)處理的原則。事務(wù)處理的原則。19.1 19.1 什么是數(shù)據(jù)一致性和事務(wù)什么是數(shù)據(jù)一致性和事務(wù)數(shù)據(jù)一致性是指數(shù)據(jù)庫的

2、數(shù)據(jù)在每一時刻都是穩(wěn)定、數(shù)據(jù)一致性是指數(shù)據(jù)庫的數(shù)據(jù)在每一時刻都是穩(wěn)定、而且是可靠的狀態(tài)。而事務(wù)是保證數(shù)據(jù)一致性的主要手段。而且是可靠的狀態(tài)。而事務(wù)是保證數(shù)據(jù)一致性的主要手段。19.1.1 19.1.1 數(shù)據(jù)一致性數(shù)據(jù)一致性對于一個數(shù)據(jù)庫來說,其中的數(shù)據(jù)可能是每時每刻都在發(fā)生對于一個數(shù)據(jù)庫來說,其中的數(shù)據(jù)可能是每時每刻都在發(fā)生著變化,而在數(shù)據(jù)變化的同時,也無時無刻不伴隨著數(shù)據(jù)的讀取著變化,而在數(shù)據(jù)變化的同時,也無時無刻不伴隨著數(shù)據(jù)的讀取。這就對數(shù)據(jù)庫的狀態(tài)產(chǎn)生了比較高的要求。這就對數(shù)據(jù)庫的狀態(tài)產(chǎn)生了比較高的要求數(shù)據(jù)庫的每次改數(shù)據(jù)庫的每次改變都是可被接受的,而每次讀取的數(shù)據(jù)也都是正常的。這就是數(shù)變

3、都是可被接受的,而每次讀取的數(shù)據(jù)也都是正常的。這就是數(shù)據(jù)一致性的體現(xiàn)。據(jù)一致性的體現(xiàn)。例如,在某個用戶的銀行賬戶中,現(xiàn)有存款例如,在某個用戶的銀行賬戶中,現(xiàn)有存款100元。此時,元。此時,如果一個用戶讀取其中的數(shù)據(jù)為如果一個用戶讀取其中的數(shù)據(jù)為100元,那么,此時的元,那么,此時的100元是可元是可以接受的數(shù)據(jù)。但在同一時刻,另一用戶針對同一賬戶進行了以以接受的數(shù)據(jù)。但在同一時刻,另一用戶針對同一賬戶進行了以下操作,向其中存入了下操作,向其中存入了100元,但是還沒有提交動作,那么,此時元,但是還沒有提交動作,那么,此時第一個用戶有可能會讀到第一個用戶有可能會讀到200元的余額。事實上,由于某

4、些原因,元的余額。事實上,由于某些原因,第二個用戶的提交沒有成功,那么第一個用戶所讀取的第二個用戶的提交沒有成功,那么第一個用戶所讀取的200元,并元,并非數(shù)據(jù)庫的真實和可靠的狀態(tài)。這就造成了讀不一致性。非數(shù)據(jù)庫的真實和可靠的狀態(tài)。這就造成了讀不一致性。另外一種情形,如果第一個用戶讀取了另外一種情形,如果第一個用戶讀取了200元的同時,取出元的同時,取出了了100元,那么計算獲得余額為元,那么計算獲得余額為100元。而第二個用戶的存款動作元。而第二個用戶的存款動作失敗,最后,第一個用戶的余額重新覆蓋數(shù)據(jù)庫中的數(shù)據(jù),那么失敗,最后,第一個用戶的余額重新覆蓋數(shù)據(jù)庫中的數(shù)據(jù),那么就會將就會將100再

5、次寫回數(shù)據(jù)庫,這造成了取出再次寫回數(shù)據(jù)庫,這造成了取出100元,最后余額還為元,最后余額還為100元的狀態(tài),此時的數(shù)據(jù)庫也不符合一致性的狀態(tài)。元的狀態(tài),此時的數(shù)據(jù)庫也不符合一致性的狀態(tài)。19.1.2 19.1.2 事務(wù)事務(wù)在數(shù)據(jù)庫中,提出了事務(wù)的概念來保證數(shù)據(jù)庫中數(shù)據(jù)在數(shù)據(jù)庫中,提出了事務(wù)的概念來保證數(shù)據(jù)庫中數(shù)據(jù)的一致性。事務(wù)往往包括一個或多個處理步驟。例如,在超的一致性。事務(wù)往往包括一個或多個處理步驟。例如,在超市購物包括,選購商品、放入購物車、付款、個人現(xiàn)金或銀市購物包括,選購商品、放入購物車、付款、個人現(xiàn)金或銀行賬戶余額減少、超市賬戶余額增加、商品庫中商品信息更行賬戶余額減少、超市賬戶余

6、額增加、商品庫中商品信息更新等步驟。這些步驟組成了一個事務(wù),當(dāng)其中任何步驟出現(xiàn)新等步驟。這些步驟組成了一個事務(wù),當(dāng)其中任何步驟出現(xiàn)異常,并且不能正常進行下去,都會影響其他所有步驟。例異常,并且不能正常進行下去,都會影響其他所有步驟。例如,付款階段不能正常進行,那么將不會對個人的現(xiàn)金或銀如,付款階段不能正常進行,那么將不會對個人的現(xiàn)金或銀行賬戶造成影響,超市的賬戶也不可能進行余額的增加,商行賬戶造成影響,超市的賬戶也不可能進行余額的增加,商品庫中也不能更新該商品的信息。品庫中也不能更新該商品的信息。同樣的,如果個人現(xiàn)金或賬戶余額不足,那么也無法同樣的,如果個人現(xiàn)金或賬戶余額不足,那么也無法完成整

7、個交易。在此之前所做的所有動作:選購商品、放入完成整個交易。在此之前所做的所有動作:選購商品、放入購物車等都將無效,商品應(yīng)當(dāng)被重新放回貨架。購物車等都將無效,商品應(yīng)當(dāng)被重新放回貨架。19.2 Oracle19.2 Oracle中的事務(wù)處理中的事務(wù)處理Oracle中的事務(wù)應(yīng)當(dāng)使用關(guān)鍵字中的事務(wù)應(yīng)當(dāng)使用關(guān)鍵字transaction。一個事。一個事務(wù)的生命周期應(yīng)當(dāng)包括:事務(wù)開始、事務(wù)執(zhí)行和事務(wù)結(jié)束。務(wù)的生命周期應(yīng)當(dāng)包括:事務(wù)開始、事務(wù)執(zhí)行和事務(wù)結(jié)束。需要注意的是,需要注意的是,Oracle中并不能顯式開始一個事務(wù),也不存中并不能顯式開始一個事務(wù),也不存在這樣的語句。事務(wù)的開始總是隱式進行的,而事務(wù)的

8、結(jié)束在這樣的語句。事務(wù)的開始總是隱式進行的,而事務(wù)的結(jié)束則可以利用則可以利用commit或者或者rollback命令進行終止。命令進行終止。Oracle中控制事務(wù)的常用命令包括:中控制事務(wù)的常用命令包括:Commit;roll back;savepoint;roll back to ;set transaction;set constraint。19.2.1 commit19.2.1 commit命令命令commit命令用于提交事務(wù),并將事務(wù)中對數(shù)據(jù)庫的修命令用于提交事務(wù),并將事務(wù)中對數(shù)據(jù)庫的修改進行持久化,即將數(shù)據(jù)庫修改為另外一種狀態(tài),而這種狀改進行持久化,即將數(shù)據(jù)庫修改為另外一種狀態(tài),而這

9、種狀態(tài)是可接受的、可靠的狀態(tài)。態(tài)是可接受的、可靠的狀態(tài)。while i1000 loop update people set salary = salary + 10*i where id = i; i := i+1;end loop;commit;對于開發(fā)者來說,最安全的方式是顯式進行數(shù)據(jù)的提對于開發(fā)者來說,最安全的方式是顯式進行數(shù)據(jù)的提交或者回滾,以結(jié)束事務(wù)。但很多時候,許多開發(fā)者并未注交或者回滾,以結(jié)束事務(wù)。但很多時候,許多開發(fā)者并未注意該問題,而是依靠開發(fā)工具來進行提交或回滾。意該問題,而是依靠開發(fā)工具來進行提交或回滾。 此時需要注意的是,如果用戶未提交對數(shù)據(jù)庫的修改此時需要注意的是,

10、如果用戶未提交對數(shù)據(jù)庫的修改,而關(guān)閉了回話,或者數(shù)據(jù)庫連接在提交之前斷開,那么針,而關(guān)閉了回話,或者數(shù)據(jù)庫連接在提交之前斷開,那么針對該數(shù)據(jù)庫的所有操作都將執(zhí)行回滾操作。對該數(shù)據(jù)庫的所有操作都將執(zhí)行回滾操作。19.2.1 commit19.2.1 commit命令命令另外,需要明確的概念是,在提交之前,數(shù)據(jù)庫已經(jīng)另外,需要明確的概念是,在提交之前,數(shù)據(jù)庫已經(jīng)進行了實際更新,不過,并未得到數(shù)據(jù)庫認(rèn)可,因此提交動進行了實際更新,不過,并未得到數(shù)據(jù)庫認(rèn)可,因此提交動作只是一個獲得認(rèn)可的過程,其花費的數(shù)據(jù)庫資源非常少。作只是一個獲得認(rèn)可的過程,其花費的數(shù)據(jù)庫資源非常少。而且,提交一條數(shù)據(jù)與提交而且,提

11、交一條數(shù)據(jù)與提交1000條數(shù)據(jù)所花費的數(shù)據(jù)庫資條數(shù)據(jù)所花費的數(shù)據(jù)庫資源是相同的。因此,當(dāng)實現(xiàn)大數(shù)據(jù)量的數(shù)據(jù)修改或者插入操源是相同的。因此,當(dāng)實現(xiàn)大數(shù)據(jù)量的數(shù)據(jù)修改或者插入操作時,應(yīng)當(dāng)采取最后一次性提交的策略。作時,應(yīng)當(dāng)采取最后一次性提交的策略。while i1000 loop update people set salary = salary + 10*i where id = i; i := i+1; commit;end loop; 在該代碼片段中,每次更新數(shù)據(jù),都有一次提交動作在該代碼片段中,每次更新數(shù)據(jù),都有一次提交動作,將造成數(shù)據(jù)庫資源的浪費。,將造成數(shù)據(jù)庫資源的浪費。 19.2.2

12、 roll back19.2.2 roll back命令命令roll back命令用于回滾用戶操作。在某些時機,例如程序代碼命令用于回滾用戶操作。在某些時機,例如程序代碼段中出現(xiàn)異?;蝈e誤,或者用戶直接發(fā)出撤銷命令,需要回滾操作。段中出現(xiàn)異?;蝈e誤,或者用戶直接發(fā)出撤銷命令,需要回滾操作?;貪L操作將終止事務(wù)處理,并撤銷用戶在當(dāng)前事務(wù)中進行的更改。回滾操作將終止事務(wù)處理,并撤銷用戶在當(dāng)前事務(wù)中進行的更改。begin while i1000 loop update people set salary = salary + 10*i where id = i; i := i+1; end loop;

13、exception roll back;end;回滾操作,首先要讀取回滾段信息,并利用這些信息將數(shù)據(jù)庫中回滾操作,首先要讀取回滾段信息,并利用這些信息將數(shù)據(jù)庫中已發(fā)生的修改重新恢復(fù)。例如,對于使用了已發(fā)生的修改重新恢復(fù)。例如,對于使用了update操作的列,則需要操作的列,則需要將其恢復(fù)到原值,而使用了將其恢復(fù)到原值,而使用了delete操作的行,則需要再次執(zhí)行插入操操作的行,則需要再次執(zhí)行插入操作。因此,回滾操作所需要的時間和花費的資源,依賴于在事務(wù)中所作。因此,回滾操作所需要的時間和花費的資源,依賴于在事務(wù)中所執(zhí)行的數(shù)據(jù)庫更改,并與之成正比。執(zhí)行的數(shù)據(jù)庫更改,并與之成正比。通常情況下,回滾

14、操作是非常耗費時間和資源的,因此,回滾往通常情況下,回滾操作是非常耗費時間和資源的,因此,回滾往往被用于處理異常,而不用作終端用戶的可操作選項。一旦終端用戶往被用于處理異常,而不用作終端用戶的可操作選項。一旦終端用戶經(jīng)常性使用回滾操作,那么將為數(shù)據(jù)庫帶來非常大的負(fù)擔(dān)。經(jīng)常性使用回滾操作,那么將為數(shù)據(jù)庫帶來非常大的負(fù)擔(dān)。應(yīng)當(dāng)保證終端用戶在提交事務(wù)之前進行確認(rèn),來代替允許用戶執(zhí)應(yīng)當(dāng)保證終端用戶在提交事務(wù)之前進行確認(rèn),來代替允許用戶執(zhí)行回滾,從而實現(xiàn)提交與回滾操作的平衡。行回滾,從而實現(xiàn)提交與回滾操作的平衡。19.2.3 savepoint19.2.3 savepoint和和rollback to

15、savepointrollback to savepoint命令命令通過對通過對roll back的描述可知,的描述可知,roll back命令走向了一命令走向了一個極端個極端回滾整個事務(wù)的所有操作。而有時,大部分的工回滾整個事務(wù)的所有操作。而有時,大部分的工作都是必須執(zhí)行的,僅有少量的工作有可能出現(xiàn)異常,并需作都是必須執(zhí)行的,僅有少量的工作有可能出現(xiàn)異常,并需要回滾。那么,除了利用多個事務(wù)進行處理之外,還可以使要回滾。那么,除了利用多個事務(wù)進行處理之外,還可以使用用save point在事務(wù)中建立標(biāo)記點,并允許用戶只回滾標(biāo)記在事務(wù)中建立標(biāo)記點,并允許用戶只回滾標(biāo)記點之后的動作?;貪L標(biāo)記點之后

16、的操作,需要使用點之后的動作?;貪L標(biāo)記點之后的操作,需要使用roll back to savepoint命令。命令。update people set id = id -1;begin savepoint insert_people; update people set status = CXL; insert into people (id, name, status) values (1, allen, ACT);exception when others then rollback to insert_people;end; 19.2.3 savepoint19.2.3 savepoin

17、t和和rollback to savepointrollback to savepoint命令命令這里需要注意的是,回滾操作雖然回滾了數(shù)據(jù)庫狀態(tài)這里需要注意的是,回滾操作雖然回滾了數(shù)據(jù)庫狀態(tài),但是并不會改變程序的運行軌跡,也就是說,程序繼續(xù)執(zhí),但是并不會改變程序的運行軌跡,也就是說,程序繼續(xù)執(zhí)行行rollback to insert_people的下一條語句。的下一條語句。 update people set id = id -1;begin savepoint insert_people; update people set staus = CXL; insert into people (

18、id, name, status) values (2, allen, ACT);exception when others then rollback to insert_people;end; commit;19.2.4 19.2.4 事務(wù)的屬性和隔離級別事務(wù)的屬性和隔離級別事務(wù)本身存在著一些屬性,這可以保證事務(wù)以某種特事務(wù)本身存在著一些屬性,這可以保證事務(wù)以某種特定的規(guī)則運行。所謂隔離,是指將事務(wù)所能看到的數(shù)據(jù)庫狀定的規(guī)則運行。所謂隔離,是指將事務(wù)所能看到的數(shù)據(jù)庫狀態(tài)與其他事務(wù)分隔開來態(tài)與其他事務(wù)分隔開來1read only屬性屬性set transaction read only;in

19、sert into people(id, name, status) values (13, youyou, ACT);commit;只讀事務(wù)的這種特性,可以提供一種穩(wěn)定的狀態(tài),從只讀事務(wù)的這種特性,可以提供一種穩(wěn)定的狀態(tài),從而處理大量的數(shù)據(jù)查詢工作。例如,在生成復(fù)雜報表時,需而處理大量的數(shù)據(jù)查詢工作。例如,在生成復(fù)雜報表時,需要查詢大量數(shù)據(jù),而這些數(shù)據(jù)又是頻繁變更的,在處理報表要查詢大量數(shù)據(jù),而這些數(shù)據(jù)又是頻繁變更的,在處理報表的過程中,可以利用只讀事務(wù)來提供穩(wěn)定的環(huán)境,以使生成的過程中,可以利用只讀事務(wù)來提供穩(wěn)定的環(huán)境,以使生成的報表有意義。的報表有意義。19.2.4 19.2.4 事務(wù)的

20、屬性和隔離級別事務(wù)的屬性和隔離級別2read write屬性屬性read write屬性可以將事務(wù)設(shè)置為可讀、可寫狀態(tài)。這屬性可以將事務(wù)設(shè)置為可讀、可寫狀態(tài)。這實際是事務(wù)的默認(rèn)狀態(tài),因此,該屬性的顯式設(shè)定,并沒有實際是事務(wù)的默認(rèn)狀態(tài),因此,該屬性的顯式設(shè)定,并沒有太大的現(xiàn)實意義。太大的現(xiàn)實意義。需要注意的是,一旦使用需要注意的是,一旦使用set transaction read write命令,那么該命令之前,不能出現(xiàn)命令,那么該命令之前,不能出現(xiàn)set transaction命令之外命令之外的其他命令。的其他命令。19.2.4 19.2.4 事務(wù)的屬性和隔離級別事務(wù)的屬性和隔離級別3seri

21、alizable隔離級別隔離級別serializable隔離級別是指串行化事務(wù)。串行化事務(wù)可隔離級別是指串行化事務(wù)。串行化事務(wù)可以實現(xiàn)與只讀事務(wù)實現(xiàn)相同的功能以實現(xiàn)與只讀事務(wù)實現(xiàn)相同的功能隔離其他事務(wù)對數(shù)據(jù)隔離其他事務(wù)對數(shù)據(jù)庫狀態(tài)的影響。但是串行化事務(wù)允許在其中執(zhí)行任何庫狀態(tài)的影響。但是串行化事務(wù)允許在其中執(zhí)行任何DML操作,包括刪除、修改、插入數(shù)據(jù)等。操作,包括刪除、修改、插入數(shù)據(jù)等。在默認(rèn)情況下,一個事務(wù)可以識別其他事務(wù)針對數(shù)據(jù)在默認(rèn)情況下,一個事務(wù)可以識別其他事務(wù)針對數(shù)據(jù)庫的修改,而這種修改僅限于已經(jīng)提交到數(shù)據(jù)庫的修改。使庫的修改,而這種修改僅限于已經(jīng)提交到數(shù)據(jù)庫的修改。使用了串行化事務(wù)

22、,那么,其他事務(wù)已經(jīng)提交的修改也將被隔用了串行化事務(wù),那么,其他事務(wù)已經(jīng)提交的修改也將被隔離。這里所說的隔離,實際是對于查詢操作來說,也就是串離。這里所說的隔離,實際是對于查詢操作來說,也就是串行化事務(wù)的處理過程中,無法查看到其他事務(wù)的修改。行化事務(wù)的處理過程中,無法查看到其他事務(wù)的修改。set transaction isolation level serializable;19.2.4 19.2.4 事務(wù)的屬性和隔離級別事務(wù)的屬性和隔離級別4read commited隔離級別隔離級別read commited隔離級別是事務(wù)的默認(rèn)隔離級別,即隔離級別是事務(wù)的默認(rèn)隔離級別,即只能讀取其他事務(wù)已

23、經(jīng)提交的修改。對于尚未提交的修改,只能讀取其他事務(wù)已經(jīng)提交的修改。對于尚未提交的修改,只有實現(xiàn)該修改的事務(wù)本身可以進行讀取。只有實現(xiàn)該修改的事務(wù)本身可以進行讀取。19.3 19.3 事務(wù)處理原則事務(wù)處理原則事務(wù)處理的原則可以概括為事務(wù)處理的原則可以概括為ACID。ACID是以下單詞的是以下單詞的首字母:首字母:l原子性(原子性(Atomicity):整個事務(wù)不可分割,要么全部):整個事務(wù)不可分割,要么全部執(zhí)行,要么都不執(zhí)行。執(zhí)行,要么都不執(zhí)行。l一致性(一致性(Consistency):事務(wù)一旦提交生效,會將數(shù)):事務(wù)一旦提交生效,會將數(shù)據(jù)庫從一種狀態(tài)轉(zhuǎn)變?yōu)榱硪环N狀態(tài)。隔離性(據(jù)庫從一種狀態(tài)轉(zhuǎn)

24、變?yōu)榱硪环N狀態(tài)。隔離性(Isolation)l隔離性(隔離性(Isolation):): 在事務(wù)處理的過程中,事務(wù)處在事務(wù)處理的過程中,事務(wù)處理的效果對于其他事務(wù),是完全透明的。理的效果對于其他事務(wù),是完全透明的。l持久性(持久性(Durablity):一旦提交了事務(wù)處理,那么事):一旦提交了事務(wù)處理,那么事務(wù)處理的效果將永久生效。務(wù)處理的效果將永久生效。19.3.1 19.3.1 原子性原子性O(shè)racle中的事務(wù)處理遵循原子性。無論事務(wù)中包含多中的事務(wù)處理遵循原子性。無論事務(wù)中包含多少語句,要么提交所有工作,要么廢除所有工作。需要注意少語句,要么提交所有工作,要么廢除所有工作。需要注意的是,

25、利用的是,利用save point和和roll back savepoint回滾部分操作回滾部分操作并非特例,這是因為利用并非特例,這是因為利用roll back savepoint也是用戶指定也是用戶指定的動作??梢钥醋鍪聞?wù)處理中的普通命令。的動作??梢钥醋鍪聞?wù)處理中的普通命令。create table t(data varchar2(2); insert into t values(a); insert into t values(b); Rollback;select * from t;19.3.2 19.3.2 一致性一致性O(shè)racle中的事務(wù)必須保證數(shù)據(jù)的一致性。數(shù)據(jù)一致性中的事務(wù)必

26、須保證數(shù)據(jù)的一致性。數(shù)據(jù)一致性的一個典型實例為外鍵約束。例如,在外鍵約束時,首先更的一個典型實例為外鍵約束。例如,在外鍵約束時,首先更新父表中的主鍵,如果在子表中有數(shù)據(jù)與該父表記錄相關(guān)聯(lián)新父表中的主鍵,如果在子表中有數(shù)據(jù)與該父表記錄相關(guān)聯(lián),那么父表的更新將被終止。同樣地,如果試圖更新子表的,那么父表的更新將被終止。同樣地,如果試圖更新子表的外鍵列,也會造成更新失敗。因為這兩個動作都破壞了數(shù)據(jù)外鍵列,也會造成更新失敗。因為這兩個動作都破壞了數(shù)據(jù)的一致性。無論哪種操作,如果成功執(zhí)行,都會使數(shù)據(jù)庫中的一致性。無論哪種操作,如果成功執(zhí)行,都會使數(shù)據(jù)庫中的數(shù)據(jù)處于邏輯上的不可接受狀態(tài)。此時的數(shù)據(jù)一致性的

27、保的數(shù)據(jù)處于邏輯上的不可接受狀態(tài)。此時的數(shù)據(jù)一致性的保持,是在出現(xiàn)在語句級,即每條持,是在出現(xiàn)在語句級,即每條DML語句都會進行校驗。語句都會進行校驗。而事務(wù)可以包含多條語句,并可以在事務(wù)開始執(zhí)行時而事務(wù)可以包含多條語句,并可以在事務(wù)開始執(zhí)行時將約束設(shè)置為延遲校驗。以外鍵約束為例,可以成功避開無將約束設(shè)置為延遲校驗。以外鍵約束為例,可以成功避開無法更新父表主鍵和子表外鍵的尷尬。但是,提交時,延遲校法更新父表主鍵和子表外鍵的尷尬。但是,提交時,延遲校驗將生效,以保持?jǐn)?shù)據(jù)一致性。驗將生效,以保持?jǐn)?shù)據(jù)一致性。19.3.2 19.3.2 一致性一致性create table vendor(vendor

28、_id integer primary key, vendor_name varchar2(20); create table po(po_id integer, vendor_id integer, constraint fk_vendor_po foreign key(vendor_id) references vendor deferrable); insert into vendor values(1, HK); insert into po values(1, 1); update vendor set vendor_id = 2;set constraints fk_vendor_

29、po deferred; update vendor set vendor_id = 2; update po set vendor_id = 2; commit;19.3.3 19.3.3 隔離性隔離性1臟讀取(臟讀?。―irty Read)臟讀取意味著,可以讀取來自外界其他動作對數(shù)據(jù)庫的修改臟讀取意味著,可以讀取來自外界其他動作對數(shù)據(jù)庫的修改,而這種修改尚未提交,未提交的數(shù)據(jù)有可能回滾。也就是說,而這種修改尚未提交,未提交的數(shù)據(jù)有可能回滾。也就是說,讀取的數(shù)據(jù)并非真正有效的數(shù)據(jù),這將直接破壞數(shù)據(jù)一致性。讀取的數(shù)據(jù)并非真正有效的數(shù)據(jù),這將直接破壞數(shù)據(jù)一致性。2不可重讀不可重讀不可重讀意味著,

30、如果用戶在某一時刻讀取了一條記錄,那不可重讀意味著,如果用戶在某一時刻讀取了一條記錄,那么,在下一時刻再次讀取時,該記錄已發(fā)生改變。其狀態(tài)類似于么,在下一時刻再次讀取時,該記錄已發(fā)生改變。其狀態(tài)類似于“人不能兩次踏入同一條河流人不能兩次踏入同一條河流”。不可重讀并非不可接受的,相。不可重讀并非不可接受的,相反,不可重讀是一種正常的數(shù)據(jù)庫狀態(tài)。這與臟讀取是有本質(zhì)區(qū)反,不可重讀是一種正常的數(shù)據(jù)庫狀態(tài)。這與臟讀取是有本質(zhì)區(qū)別的。別的。3影像讀取影像讀取影像讀取意味著,如果用戶在某一時刻執(zhí)行了一個查詢,在影像讀取意味著,如果用戶在某一時刻執(zhí)行了一個查詢,在下一時刻再次執(zhí)行相同查詢時,可能會有新的數(shù)據(jù)加

31、入。但是,下一時刻再次執(zhí)行相同查詢時,可能會有新的數(shù)據(jù)加入。但是,已經(jīng)讀取的數(shù)據(jù)是不會改變的,只是查詢所獲得結(jié)果集更大而已已經(jīng)讀取的數(shù)據(jù)是不會改變的,只是查詢所獲得結(jié)果集更大而已。19.3.4 19.3.4 持久性持久性持久性是指,當(dāng)事務(wù)一旦提交,其改變將會生效,并持久性是指,當(dāng)事務(wù)一旦提交,其改變將會生效,并將信息存儲在磁盤上。當(dāng)系統(tǒng)再次重新啟動或者故障時,這將信息存儲在磁盤上。當(dāng)系統(tǒng)再次重新啟動或者故障時,這些信息不會丟失。些信息不會丟失。對于提交動作來說,用戶見到提交成功提示時,對于提交動作來說,用戶見到提交成功提示時,Oracle并未完成持久化工作。但是,并未完成持久化工作。但是,Or

32、acle數(shù)據(jù)庫利用數(shù)據(jù)庫利用redo日志文件來保證系統(tǒng)的持久性。日志文件來保證系統(tǒng)的持久性。redo文件在事務(wù)提交文件在事務(wù)提交的前一刻生成,其中記錄了一旦提交時,系統(tǒng)崩潰,那么該的前一刻生成,其中記錄了一旦提交時,系統(tǒng)崩潰,那么該如何將事務(wù)的工作再次執(zhí)行,以保證事務(wù)真正執(zhí)行完畢,并如何將事務(wù)的工作再次執(zhí)行,以保證事務(wù)真正執(zhí)行完畢,并持久化到數(shù)據(jù)庫。持久化到數(shù)據(jù)庫。19.4 19.4 本章實例本章實例本節(jié)將通過一個實例查看事務(wù)嵌套的處理原則。事務(wù)本節(jié)將通過一個實例查看事務(wù)嵌套的處理原則。事務(wù)嵌套是指,在事務(wù)的處理過程中調(diào)用了其他子程序,子程序嵌套是指,在事務(wù)的處理過程中調(diào)用了其他子程序,子程序

33、所完成的功能也是一個事物。所完成的功能也是一個事物?!痉独痉独?9-12】該范例用于演示事務(wù)嵌套的處理原則?!吭摲独糜谘菔臼聞?wù)嵌套的處理原則。create table records(record varchar2(20);create or replace procedure local is counter number := -1; begin select count(*) into counter from records; dbms_output.put_line(子程序,當(dāng)前記錄數(shù)為:子程序,當(dāng)前記錄數(shù)為: | counter); insert into records va

34、lues (該記錄來自該記錄來自local); commit; end; 19.4 19.4 本章實例本章實例declare counter number := -1; begin delete from records ; commit; insert into records values (該記錄來自該記錄來自Global); local; select count(*) into counter from records; dbms_output.put_line(主程序,當(dāng)前記錄數(shù)為:主程序,當(dāng)前記錄數(shù)為: | counter); rollback; local; insert into records values (該記錄來自該記錄來自Gobal); commit; local; select count(*) into counter from records; dbms_output.put_line(主程序,當(dāng)前記錄數(shù)為:

溫馨提示

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

評論

0/150

提交評論