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) |