本文轉自:http://yedward.net/?id=24
set transaction語句允許開始一個只讀或者只寫的事務,建立隔離級別或者是為當前的事務分配一個特定的回滾段。需要注意的是,set transaction必須是事務處理中的第一條語句,注意是事務處理的第一條語句,不是指代碼的第一條語句,並且set transaction在一個事務中只能出現一次。
set transaction的語法如下:
SET TRANSACTION parameter;
parameter是用來指定參數的,其可用參數有如下幾種類型:
(1)read only:表示建立只讀事務,在此事務中只有select、select into、open、fetch、close、lock table、commit、rollback語句才允許出現,不可以執行insert、update、select for update等非法操作,對於這種事務模式不用指定回滾段。
(2)read write:建立讀寫事務,該事務既可讀、也可寫,oracle默認的事務就是這種類型。
(3)isolation level:用來設置事務的隔離級別,可以設置為serializable和read committed這兩個選項。serializable會使得對已經修改但沒有提交的數據對象的DML事務失敗;read committed會使得對已經修改但沒有提交的數據庫對象的DML事務在進行修改時,會等待先前DML鎖釋放,這也是oracle默認的事務的隔離級別。
可以使用use rollback segment給事務定義一個合適的回滾段,如下例子:
SET TRANSACTION ISOLATION USE ROLLBACK SEGMENT segmentname;
一般在做報表查詢的時候,可以先設置該查詢事務為一個只讀事務,以避免出現寫操作,可以看下面這樣的一個例子:
DECLARE l_name VARCHAR2(100); l_age NUMBER; l_sex VARCHAR2(2); BEGIN -- 為保證set transaction是事務的第一條語句,先使用commit或rollback來結束掉前面可能存在的事務 COMMIT; -- 使用name給事務命名 SET TRANSACTION READ ONLY NAME '查詢報表'; SELECT NAME INTO l_name FROM student WHERE student_id = 1001; SELECT age INTO l_age FROM student WHERE student_id = 1001; SELECT sex INTO l_sex FROM student WHERE student_id = 1001; -- 終止只讀事務 COMMIT; dbms_output.put_line('輸出:' || l_name || l_age || l_sex); END;