本文轉自:http://blog.sina.com.cn/s/blog_66f845010100qelf.html 一, Transaction control 預設Transaction 由修改數據開始(獲得TX LOCK), 手工也可以用set transaction或DBMS_TRANSACT ...
本文轉自:http://blog.sina.com.cn/s/blog_66f845010100qelf.html
一, Transaction control 預設Transaction 由修改數據開始(獲得TX LOCK), 手工也可以用set transaction或DBMS_TRANSACTION來控制, 由COMMIT,ROLLBACK結束(ROLLBACK TO SAVEPOINT並不會結束一個TRANSACTION). TRANSACTION語句包含以下COMMIT, ROLLBACK, SAVEPOINT ,ROLLBACK TO SAVEPOINT, SET TRANSACTION(設置TRANSACTION相關特性) 自動控制 Statement-Level Atomicity create table t ( x int check ( x>0 ) ); Insert into t values ( 1 ); Insert into t values ( -1 ); 的TRANSACTION CONTROL如下所示 Savepoint statement1; Insert into t values ( 1 ); If error then rollback to statement1; Savepoint statement2; Insert into t values ( -1 ); If error then rollback to statement2; 在本例中T中有1而無-1 Procedure-Level Atomicity 作一個名為P的PROCEDURE,裡面有兩個插入語句 create or replace procedure p 2 as 3 begin 4 insert into t values ( 1 ); 5 insert into t values (-1 ); 6 end; 然後調用此PROCEDURE P begin 2 p; 3 end; 相當於 begin 2 savepoint sp; 3 p; 4 exception 5 when others then 6 rollback to sp; 7 end; 也就是說兩個INSERT一起成功或失敗,本例中T表內沒有被插入數據。但是,如果我們加上exception則結果大不相同。 begin 2 p; 3 exception 4 when others then null; 5 end; 效果會和Statement-Level Atomicity例子的結果一樣,T表中有1,而-1插入失敗。 二, 錯誤的TRANSACTION的習慣 首先, TRANSACTION要儘量短,因為LOCK,BLOCK, DATA是非常耗資源的。其次為了實現讓TRANSACTION儘量短而設置迴圈中定時提交是錯誤的. 大家肯定都有過類似的經驗,就是在PROCEDURE作一個大的LOOP時,有人會告訴你要定期提交,比如1000行一提交,他們的根據是- 把大的TRANSACTIOn變成小的TRANSACTION效率更高,
- 而且會減少UNDO的使用,因而很大程度提高速度。