SET TRANSACTION READ ONLY实际上是实现数据库四大事务(ACID)中隔离性(Isolation)的一种手段,用来将数据的读一致性定在某一时间点,即不管其他事务如何更改数据(不能在当前session中再使用自治事务),在当前事务中进行查询的结果始终不变。由于Oracle的读一致性是通过undo段来实现的,所以如果在此期间DML修改的数据量很大而undo空间设置过小可能会导致ORA-01555(快照过旧)错误。 Test Code:Step 1, @session 1(SET TRANSACTION READ ONLY):
- Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
- Connected as tuser1
-
- SQL> select * from dept;
-
- DEPTNO DNAME LOC
- ------ -------------- -------------
- 10 ACCOUNTING NEW YORK01
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
-
- SQL> SET TRANSACTION READ ONLY;
-
- Transaction set
Step 2, @session 2(DML, insert a new record):
- SQL> select * from dept;
-
- DEPTNO DNAME LOC
- ------ -------------- -------------
- 10 ACCOUNTING NEW YORK01
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
-
- SQL> insert into dept(deptno) values(50);
-
- 1 row inserted
-
- SQL> commit;
-
- Commit complete
-
- SQL> select * from dept;
-
- DEPTNO DNAME LOC
- ------ -------------- -------------
- 10 ACCOUNTING NEW YORK01
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
- 50
step 3, @session 1(query the same object and get the same result):
- SQL> select * from dept;
-
- DEPTNO DNAME LOC
- ------ -------------- -------------
- 10 ACCOUNTING NEW YORK01
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
Step 4, @session 1(autonomous transaction is not permitted):
- SQL> declare
- 2 pragma AUTONOMOUS_TRANSACTION;
- 3 begin
- 4 update dept set loc = loc || "-XXX" where deptno=20;
- 5 end;
- 6 /
-
- declare
- pragma AUTONOMOUS_TRANSACTION;
- begin
- update dept set loc = loc || "-XXX" where deptno=20;
- end;
-
- ORA-06519: active autonomous transaction detected and rolled back
- ORA-06512: at line 6
-
- SQL> select * from dept;
-
- DEPTNO DNAME LOC
- ------ -------------- -------------
- 10 ACCOUNTING NEW YORK01
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
-
- SQL>
Step 5, @session 1(commit current transaction and we get the change):
- SQL> commit;
-
- Commit complete
-
- SQL> select * from dept;
-
- DEPTNO DNAME LOC
- ------ -------------- -------------
- 10 ACCOUNTING NEW YORK01
- 20 RESEARCH DALLAS
- 30 SALES CHICAGO
- 40 OPERATIONS BOSTON
- 50
Oracle PL/SQL之自定义函数的读一致性Oracle DBA之手动注册监听(listener) -- alter system set local_listener=“T02”;相关资讯 Oracle教程
- Oracle中纯数字的varchar2类型和 (07/29/2015 07:20:43)
- Oracle教程:Oracle中查看DBLink密 (07/29/2015 07:16:55)
- [Oracle] SQL*Loader 详细使用教程 (08/11/2013 21:30:36)
| - Oracle教程:Oracle中kill死锁进程 (07/29/2015 07:18:28)
- Oracle教程:ORA-25153 临时表空间 (07/29/2015 07:13:37)
- Oracle教程之管理安全和资源 (04/08/2013 11:39:32)
|
本文评论 查看全部评论 (0)