事務的read only mode

pingley發表於2012-05-22
事務的read only mode 
在session 1中設定事務的模式為read noly,同時執行一個查詢。
SQL> set transaction read only;
Transaction set.
SQL> select sum(salary) from employees;
SUM(SALARY)
-----------
     692850
在session 2 中執行一個update 語句。
SQL> update employees
  2  set salary = salary + 100
  3  /
107 rows updated.
SQL> commit;--提交事務,持久化到資料庫。
Commit complete.
返回到session 1 中執行同樣的查詢,得到的結果和第一次的查詢時一樣的。
執行一個commit 或者rollback 語句,終止事務的read only 模式。再次執行
同樣的查詢,在這次的查詢中可見session 2 中的提交的事務的修改。
SQL> select sum(salary) from employees;
SUM(SALARY)
-----------
     692850
SQL> commit;
Commit complete.
SQL> select sum(salary) from employees;
SUM(SALARY)
-----------
     703550
事務的read only mode 是用來避免不可重複讀和幻讀的。設定了read only mode 在事務
中只能看見執行set transaction read only 語句以前提交的資料,事務read only  mode期間
其他事務的修改是不可見的,oracle將會使用 undo data 資料來提供讀一致性。
上面的例子是關於事務的read only  mode用來避免不可重複讀的,下面的例子將演示
事務的read only mode 用來避免幻讀.
在session 1 中設定事務的模式為 read only。並執行一個查詢。
SQL> set transaction read only;
Transaction set.
SQL> select count(*) from employees;
  COUNT(*)
----------
       107
在session 2 中執行一條insert 語句並提交。
SQL>  insert into employees
  2  (employee_id, last_name, email,
  3  hire_date, job_id) values (210,
  4  'Hintz', 'JHINTZ', SYSDATE,
  5  'SH_CLERK');
1 row created.
SQL> commit;
Commit complete.
返回到session 1 中,執行同樣的查詢,由結果可知當設定了事務的模式為read only 以後
不會產生幻讀。session 1 中的 read only mode 事務開始以後,其他事務執行的insert 
語句對session 1 中的事務是不可見的,從而避免幻讀。
SQL> select count(*) from employees;
  COUNT(*)
----------
       107
SQL> commit;--結束事務的read only mode。
Commit complete.
SQL> select count(*) from employees;
  COUNT(*)
----------
       108
下面演示一個事務在read only mode 模式下應該注意的一個問題。
SQL> show user
USER is "HR"
SQL> set transaction read only;
Transaction set.
SQL>  select salary from hr.employees
  2   where employee_id = 100;
    SALARY
----------
     24000
SQL> update employees
  2  set salary = salary - 300
  3  where employee_id = 100;
update employees
*
ERROR at line 1:
ORA-01456: 不能在 READ ONLY 事務處理中執行插入/刪除/更新操作
事務在read only mode 下,不能執行DML操作,原因很明顯嘛,事務是隻讀的而不是預設的read,write.
如果換成sys 使用者,那就沒有這個限制了。
小結:事務的read only mode 是事務隔離等級中的一種,當需要在運用程式中避免
不可重複讀或者幻讀的時候可以使用,同時應該注意可能出現的問題。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26110315/viewspace-730637/,如需轉載,請註明出處,否則將追究法律責任。

相關文章