文章詳情頁(yè)
Oracle數(shù)據(jù)操作和控制語(yǔ)言詳解(二)
瀏覽:137日期:2023-11-17 17:20:45
事務(wù)控制事務(wù)控制包括協(xié)調(diào)對(duì)相同數(shù)據(jù)的多個(gè)同步的訪問(wèn)。當(dāng)一個(gè)用戶改變了另一個(gè)用戶正在使用的數(shù)據(jù)時(shí),Oracle使用事務(wù)控制誰(shuí)可以操作數(shù)據(jù)。事務(wù)事務(wù)表示工作的一個(gè)基本單元,是一系列作為一個(gè)單元被成功或不成功操作的SQL語(yǔ)句。 在SQL和PL/SQL中有很多語(yǔ)句讓程序員控制事務(wù)。程序員可以: 1、顯式開始一個(gè)事物,選擇語(yǔ)句級(jí)一致性或事務(wù)級(jí)一致性 2、設(shè)置撤銷回滾點(diǎn),并回滾到回滾點(diǎn)3、完成事務(wù)永遠(yuǎn)改變數(shù)據(jù)或者放棄修改。事務(wù)控制語(yǔ)句 語(yǔ)句 用途 Commit 完成事務(wù),數(shù)據(jù)修改成功并對(duì)其他用戶開放 Rollback 撤銷事務(wù),撤銷所有操作 rollback to savepoint 撤銷在設(shè)置的回滾點(diǎn)以后的操作 set transaction 響應(yīng)事務(wù)或語(yǔ)句的一致性;非凡對(duì)于事務(wù)使用回滾段例: BEGINUPDATE checkingSET balance=balance-5000WHERE account='Kieesha';INSERT INTO checking_log(action_date,action,amount)VALUES (SYSDATE,'Transfer to brokerage',-5000);UPDATE brokerageSET cash_balance=cash_balance+5000WHERE account='Kiesha';INSERT INTO brokerage_log(action_date,action,amount)VALUES (SYSDATE,'Tracfer from checking',5000)COMMITEXCEPTIONWHEN OTHERSROLLBACKENDSavepoint 和 部分回滾(Partial Rollback)在SQL和PL/SQL中Savepoint是在一事務(wù)范圍內(nèi)的中間標(biāo)志。經(jīng)常用于將一個(gè)長(zhǎng)的事務(wù)劃分為小的部分。保留點(diǎn)Savepoint可標(biāo)志長(zhǎng)事務(wù)中的任何點(diǎn),答應(yīng)可回滾該點(diǎn)之后的操作。在應(yīng)用程序中經(jīng)常使用Savepoint;例如一過(guò)程包含幾個(gè)函數(shù),在每個(gè)函數(shù)前可建立一個(gè)保留點(diǎn),假如函數(shù)失敗,很輕易返回到每一個(gè)函數(shù)開始的情況。在回滾到一個(gè)Savepoint之后,該Savepoint之后所獲得的數(shù)據(jù)封鎖被釋放。為了實(shí)現(xiàn)部分回滾可以用帶TO Savepoint子句的ROLLBACK語(yǔ)句將事務(wù)回滾到指定的位置。例 BEGIN INSERT INTO ATM_LOG(who,when,what,where)VALUES ('Kiesha',SYSDATE,'Withdrawal of $100','ATM54')SAVEPOINT ATM_LOGGED;UPDATE checkingSET balance=balance-100RETURN balance INTO new_balance;IF new_balance<0THENROLLBACK TO ATM_LOGGED;COMMITRAISE insufficient_funda;END IFEND 要害字SAVEPOINT是可選的,所以下面兩個(gè)語(yǔ)句是等價(jià)的: ROLLBACK TO ATM_LOGGED;ROLLBACK TO SAVEPOINT ATM_LOGGED;一致性和事務(wù)一致性是事物控制的要害慨念。把握了oracle 的一致性模型,能使您更好的,更恰當(dāng)?shù)氖褂檬聞?wù)控制。oracle通過(guò)一致性保證數(shù)據(jù)只有在事務(wù)全部完成后才能被用戶看見和使用。這項(xiàng)技術(shù)對(duì)多用戶數(shù)據(jù)庫(kù)有巨大的作用。oracle經(jīng)常使用語(yǔ)句級(jí)(state-level)一致性,保證數(shù)據(jù)在語(yǔ)句的生命期之間是可見的但不能被改變。事務(wù)由多個(gè)語(yǔ)句組成,當(dāng)使用事務(wù)時(shí),事物級(jí)(transaction-level)一致性在整個(gè)事務(wù)生命期中保證數(shù)據(jù)對(duì)所有語(yǔ)句都是可見的。oracle通過(guò)SCN(syatem change number)實(shí)施一致性。一個(gè)SCN是一個(gè)面向時(shí)間的數(shù)據(jù)庫(kù)內(nèi)部鍵。SCN只會(huì)增加不會(huì)減少,SCN表示了時(shí)間上的一個(gè)點(diǎn),每個(gè)數(shù)據(jù)塊都有一個(gè)SCN,通過(guò)比較這個(gè)點(diǎn)實(shí)施操作。事務(wù)級(jí)一致性SET TRANSACTION 的一個(gè)作用是確保事務(wù)級(jí)一致或語(yǔ)句級(jí)一致中有一個(gè)實(shí)施。ORACLE使用這些術(shù)語(yǔ): ISOLATION LEVEL READ COMMIT 表示語(yǔ)句級(jí)一致 ISOLATION LEVEL SERIALIZABLE 表示事務(wù)級(jí)一致。例: SET TRANSACTION ISOLATION LEVEL READ COMMIT;SET TRANSACTION ISOLATION LEVEL READ COMMIT下面的語(yǔ)句也能確保事務(wù)級(jí)一致: SET TRANSCATION READ ONLY任何企圖在只讀(READ ONLY)事務(wù)中修改數(shù)據(jù)的操作都會(huì)拋出一個(gè)異常。但是,READ ONLY事務(wù)只能在下列語(yǔ)句中使用: SELECT(沒(méi)有FOR UPDATE子句)LOCK TABLESET ROLEALTER SYSTEMALTER ALARM即使沒(méi)有改變?nèi)魏螖?shù)據(jù),READ ONLY事務(wù)依然必須使用一個(gè)COMMIT或ROLLBACK以結(jié)束整個(gè)事務(wù)。SET TRANSCTION的另外一個(gè)應(yīng)用是在回滾時(shí)直接使用回滾段(ROLLBACK SEGMENT)?;貪L段是ORACLE的一個(gè)非凡的數(shù)據(jù)對(duì)象,回滾段的頭部包含正在使用該回滾段事務(wù)的信息。當(dāng)用戶回滾事務(wù)(ROLLBACK)時(shí),ORACLE將會(huì)利用回滾段中的數(shù)據(jù)前影像來(lái)將修改的數(shù)據(jù)恢復(fù)到原來(lái)的值。oracle用round-robin給事務(wù)隨機(jī)分配回滾段。一個(gè)大的事務(wù)可以分配任何回滾段,這也許會(huì)導(dǎo)致回滾段的大小變得很大。因此要避免讓大的事務(wù)隨機(jī)分配回滾段。事務(wù)以SET TRANSACTION開始,象下面這樣: SET TRANSACTION USE ROLLBACK SEGMENT rb_large;rb_large是一個(gè)大的回滾段的名稱,現(xiàn)在就給一個(gè)大的事務(wù)分配了一個(gè)大的回滾段,其他的小的回滾段將不由動(dòng)態(tài)空間治理,這樣就更有效率。 下面我們看一個(gè)例子.我們有一個(gè)回滾段表空間大小是2G,在高峰時(shí)期需要10個(gè)回滾段以滿足用戶的需要,這些高峰在線用戶只有小的事務(wù)。一周我們連續(xù)運(yùn)行了4個(gè)大的事務(wù),這些事務(wù)需要?jiǎng)h除和加載數(shù)據(jù),每一個(gè)撤銷需要1G,回滾段的大小如下: rb_large(initial 100M minextenta 2)rb1 (initial 1M next minextents 5) rb2 (initial 1M next minextents 5)rb3 (initial 1M next minextents 5)rb4 (initial 1M next minextents 5)rb5 (initial 1M next minextents 5)rb6 (initial 1M next minextents 5)rb7 (initial 1M next minextents 5)rb8 (initial 1M next minextents 5)rb9 (initial 1M next minextents 5)rb10 (initial 1M next minextents 5) 所有的都非常恰當(dāng)?shù)陌才旁?G的表空間中,假如我們?nèi)笔〉膔ound-robin給事務(wù)分配回滾段,4個(gè)大事務(wù)將有4個(gè)獨(dú)立的回滾段,每個(gè)回滾段的大小將是1G,假如這樣我們的2G表空間就不夠,而數(shù)據(jù)庫(kù)治理員就不得不在夜晚2點(diǎn)起來(lái)工作,每個(gè)事務(wù)都由以下面的語(yǔ)句開始: SET TRANSACTION USE ROLLBACK SEGMENT rb_large 現(xiàn)在 4個(gè)事務(wù)重用相同的表空間,保正4個(gè)回滾段的表空間在2G以內(nèi)。數(shù)據(jù)庫(kù)治理員可以睡到天亮。
標(biāo)簽:
Oracle
數(shù)據(jù)庫(kù)
排行榜
