[轉]oracle中使用set transaction設置事務屬性


本文轉自: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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM