事務控制
事務控制包括協調對相同資料的多個同步的訪問。當一個使用者改變了另一個使用者正在使用的資料時,oracle使用事務控制誰可以操作資料。
事務
事務表示工作的一個基本單元,是一系列作為一個單元被成功或不成功操作的SQL語句。在SQL和PL/SQL中有很多語句讓程式員控制事務。程式員可以:
1、顯式開始一個事物,選擇語句級一致性或事務級一致性
2、設定撤銷復原點,並復原到復原點
3、完成事務永遠改變資料或者放棄修改。
事務控制語句
| 語句 |
用途 |
| Commit |
完成事務,資料修改成功並對其他使用者開放 |
| Rollback |
撤銷事務,撤銷所有操作 |
| rollback to savepoint |
撤銷在設定的復原點以後的操作 |
| set transaction |
響應事務或語句的一致性;特別對於事務使用復原段 |
例:
BEGIN UPDATE checking SET balance=balance-5000 WHERE account='Kieesha';INSERT INTO checking_log(action_date,action,amount) VALUES (SYSDATE,'Transfer to brokerage',-5000); UPDATE brokerage SET cash_balance=cash_balance+5000 WHERE account='Kiesha'; INSERT INTO brokerage_log(action_date,action,amount) VALUES (SYSDATE,'Tracfer from checking',5000) COMMIT EXCEPTION WHEN OTHERS ROLLBACK END |
Savepoint 和 部分復原(Partial Rollback)
在SQL和PL/SQL中Savepoint是在一事務範圍內的中間標誌。經常用於將一個長的事務劃分為小的部分。保留點Savepoint可標誌長事務中的任何點,允許可復原該點之後的操作。在應用程式中經常使用Savepoint;例如一過程包含幾個函數,在每個函數前可建立一個保留點,如果函數失敗,很容易返回到每一個函數開始的情況。在復原到一個Savepoint之後,該Savepoint之後所獲得的資料封鎖被釋放。為了實現部分復原可以用帶TO Savepoint子句的ROLLBACK語句將交易回復到指定的位置。
例
| BEGIN INSERT INTO ATM_LOG(who,when,what,where) VALUES ('Kiesha',SYSDATE,'Withdrawal of $100','ATM54') SAVEPOINT ATM_LOGGED; UPDATE checking SET balance=balance-100 RETURN balance INTO new_balance; IF new_balance<0 THEN ROLLBACK TO ATM_LOGGED; COMMIT RAISE insufficient_funda; END IF END
|
關鍵字SAVEPOINT是可選的,所以下面兩個語句是等價的:
ROLLBACK TO ATM_LOGGED; ROLLBACK TO SAVEPOINT ATM_LOGGED; |
一致性和事務
一致性是事物控制的關鍵慨念。掌握了oracle 的一致性模型,能使您更好的,更恰當的使用事務控制。oracle通過一致性保證資料只有在事務全部完成後才能被使用者看見和使用。這項技術對多使用者資料庫有巨大的作用。
oracle常常使用語句級(state-level)一致性,保證資料在語句的生命期之間是可見的但不能被改變。事務由多個語句組成,當使用事務時,事物級(transaction-level)一致性在整個事務生命期中保證資料對所有語句都是可見的。
oracle通過SCN(syatem change number)實施一致性。一個SCN是一個面向時間的資料庫內部鍵。SCN只會增加不會減少,SCN表示了時間上的一個點,每個資料區塊都有一個SCN,通過比較這個點實施操作。
事務級一致性
SET TRANSACTION 的一個作用是確保事務級一致或語句級一致中有一個實施。ORACLE使用這些術語:
ISOLATION LEVEL READ COMMIT 表示語句級一致
ISOLATION LEVEL SERIALIZABLE 表示事務級一致。
例:
| SET TRANSACTION ISOLATION LEVEL READ COMMIT; SET TRANSACTION ISOLATION LEVEL READ COMMIT |
下面的語句也能確保事務級一致:
| SET TRANSCATION READ ONLY |
任何企圖在唯讀(READ ONLY)事務中修改資料的操作都會拋出一個異常。但是,READ ONLY事務只能在下列語句中使用:
SELECT(沒有FOR UPDATE子句) LOCK TABLE SET ROLE ALTER SYSTEM ALTER ALARM |
即使沒有改變任何資料,READ ONLY事務依然必須使用一個COMMIT或ROLLBACK以結束整個事務。
SET TRANSCTION的另外一個應用是在復原時直接使用復原段(ROLLBACK SEGMENT)。復原段是ORACLE的一個特殊的資料對象,復原段的頭部包含正在使用該復原段事務的資訊。當使用者復原事務(ROLLBACK)時,ORACLE將會利用復原段中的資料前影像來將修改的資料恢複到原來的值。oracle用round-robin給事務隨機分配復原段。一個大的事務可以分配任何復原段,這也許會導致復原段的大小變得很大。因此要避免讓大的事務隨機分配復原段。
事務以SET TRANSACTION開始,象下面這樣:
| SET TRANSACTION USE ROLLBACK SEGMENT rb_large; |
rb_large是一個大的復原段的名稱,現在就給一個大的事務分配了一個大的復原段,其他的小的復原段將不由動態空間管理,這樣就更有效率。
下面我們看一個例子.我們有一個復原段資料表空間大小是2G,在高峰時期需要10個復原段以滿足使用者的需要,這些高峰線上使用者只有小的事務。一周我們連續運行了4個大的事務,這些事務需要刪除和載入資料,每一個撤銷需要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) |
所有的都非常恰當的安排在2G的資料表空間中,如果我們預設的round-robin給事務分配復原段,4個大事務將有4個獨立的復原段,每個復原段的大小將是1G,如果這樣我們的2G資料表空間就不夠,而資料庫管理員就不得不在夜晚2點起來工作,每個事務都由以下面的語句開始:
| SET TRANSACTION USE ROLLBACK SEGMENT rb_large |
現在 4個事務重用相同的資料表空間,保正4個復原段的資料表空間在2G以內。資料庫管理員可以睡到天亮。