ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 事务的read only mode

事务的read only mode

原创 Linux操作系统 作者:pingley 时间:2012-05-22 22:03:25 0 删除 编辑
事务的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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    169
  • 访问量
    717972