事务的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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26110315/viewspace-730637/