Chinaunix首页 | 论坛 | 博客
  • 博客访问: 380568
  • 博文数量: 113
  • 博客积分: 3035
  • 博客等级: 中校
  • 技术积分: 1430
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-01 16:32
文章分类
文章存档

2011年(42)

2010年(70)

2009年(1)

我的朋友

分类: Oracle

2010-07-27 16:18:00

oracle有三种隔离级
read commited 提交读,这个是默认隔离级
serializable 串行读
read only 只读

串行读隔离级保证了在串行事务启动后读取的内容一致,不会产生幻想读和失真读。同时,启动串行事务后,不允许修改其它事务修改的行,否则报ORA-08177错误。
SQL> update test_serializable set a=399 where a =99;
update test_serializable set a=399 where a =99
       *
ERROR at line 1:
ORA-08177: can't serialize access for this transaction

注解:
失真读:在事务A两次查询之间有其它事务进行了修改或删除,导致A两次查询的结果不一致
幻想读:在事务A两次查询之间有其它事务进行了插入,导致A两次查询的结果不一致
错读:事务A读到了其它事务还没有提交的内容

设置隔离级:

  设置一个事务的隔离级别:事务隔离级在set后就生效,事务结束后就结束

  SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

 SET TRANSACTION READ ONLY;

 设置增个会话的隔离级别:会话隔离级在select后生效,commit后结束隔离级,下次select

又重新开启隔离级,exit后才完全失效

ALTER SESSION SET ISOLATION_LEVEL SERIALIZABLE;

ALTER SESSION SET ISOLATION_LEVEL READ COMMITTED;

READ ONLY隔离级只能在事务设置,设置后不允许进行DML操作,否则报错
但是可以进行DDL操作,尤其注意!
SQL> SET TRANSACTION READ ONLY;

Transaction set.

SQL> update test_serializable set a=399 where a =99;
update test_serializable set a=399 where a =99
       *
ERROR at line 1:
ORA-01456: may not perform insert/delete/update operation inside a READ ONLY
transaction


SQL> drop table t;

Table dropped.

自治事务不影响隔离级,相当于在另一个session下执行。
*************************
declare
pragma autonomous_transaction;
begin
update t2  set x = x+1;
commit;
end;
/
**********************************************


阅读(915) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~