set transaction readonly 类似于SERIALIZABLE事务隔离级别,在发布SET TRANSACTION
READ ONLY起的所有SELECT语句,其结果均为同一个时间点一致,直至显式地发布了COMMIT或ROLLBACK命令或隐式提交(执行DDL)。这个时间点为SET TRANSACTION READ ONLY这个语句执行后的时间点。这个语句与SERIALIZABLE不同之处在于,在READ ONLY这个范围内,不能进行DML。以下用测试说明:用TEST1用户开启两个会话
在会话一中:
SQL> create table t1 (a int );
Table created.
SQL> insert into t1 values (10);
1 row created.
SQL> commit;
Commit complete.
在会话二中:
SQL> select * from t1;
A
----------
10
SQL> set transaction read only;
Transaction set.
SQL> select * from t1;
A
----------
10
然后在会话一中插入一行数据,并提交:
SQL> insert into t1 values (20);
1 row created.
SQL> commit;
Commit complete.
在会话二中查看表t2的数据:
SQL> /
A
----------
10
SQL> /
A
----------
10
SQL> commit;
Commit complete.
SQL> select * from t1;
A
----------
10
20
可以看到,虽然会话一已经插入了一条数据并提交了,但是查询时,仍然只能看到一条数据。在COMMIT之后,SET TRANSACTION READ ONLY作用结束,再查询T1,可以看到新插入的数据了。
我们再看一下,这个“时间点”是从第一个SELECT语句的时候还是SET TRANSACTION READ ONLY刚执行完的时候:在会话二中:
SQL> set transaction read only;
Transaction set.
然后在会话一中:
SQL> insert into t1 values (30);
1 row created.
SQL> commit;
Commit complete.
在会话二中:
SQL> select * from t1;
A
----------
10
20
可以看到,新插入的数据30是在会话二的SET TRANSACTION READ
ONLY之后和SELECT之前插入的,但SELECT语句看不到这个数据,因此这个时间点是在执行完SET TRANSACTION READ ONLY之后,而不是第一个SELECT语句执行那一刻。
我们继续下面的测试:在会话二中:
SQL> drop table t2;
Table dropped.
SQL> select * from t1;
A
----------
10
20
30
可以看到DROP语句之后,由于隐式提交,SET TRANSACTION READ ONLY作用范围结束,又可以查到新插入的数据。
SQL> set transaction read only;
Transaction set.
SQL> insert into t1 values (40);
insert into t1 values (40)
*
ERROR at line 1:
ORA-01456: may not perform. insert/delete/update operation inside a READ ONLY transaction
可以看到,在SET TRANSACTION READ ONLY之后,不能执行DML
注意:SYS用户并不受SET TRANSACTION READ ONLY的影响:
SQL> show user
USER is "SYS"
SQL> set transaction read only;
Transaction set.
SQL> delete from t1 where rownum=1;
1 row deleted.
SQL> commit;
Commit complete.
以上测试即证明了这一点。
EXP导出数据时,如果CONSISTEN参数设为TRUE,则EXP导出时,会先发布SET TRANSACTION READ ONLY,保证所有导出数据在同一时间点上的一致性。当然,如果事务频繁,导出的数据量又大,很可能会遭遇ORA-01555错误。由于SET TRANSACTION READ ONLY对SYS用户无效,用SYS用户导出时CONSISTENT设为TRUE,应该没有效果。有兴趣的朋友可以进行测试。
1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/firefoxboy/archive/2008/10/06/3023687.aspx
相关推荐
oracle-事务oracle-transaction信息管理与信息系统.doc
oracle-事务oracle-transaction信息管理与信息系统学士学位论文.doc
ORACLE-事务ORACLE-TRANSACTION-信息管理与信息系统本科毕业设计.doc
Oracle自治事务的介绍(Autonomous_Transactions)PRAGMA_AUTONOMOUS_TRANSACTION
Oracle Purchasing 11i XML Transaction Delivery Setup Guide
Oracle Services for Microsoft Transaction Server Developer's Guide
Tephra 在 Apache HBase 的基础上提供了全局一致性的事务支持。HBase 提供了强一致性的基于行和区域的 ACID 操作支持,但是牺牲了在跨区域操作的支持。这就要求应用开发者花很大力气来确保区域边界上操作的一致性。...
分布式事务演示-distributed-transaction-demo
本文介绍了Oracle 事务概念和知识。在测试通过的基础上,采用讲解结合实例的方式,对Oracle 事务概念和知识进行了说明和讲解,并对关键知识点进行了标注,读者只需按照本文内容逐步进行学习和操作,即可完成Oracle...
14.5.4 Set Transaction(设置事务) 391 14.5.5 Set Constraints(设置约束) 392 14.6 将运算分组为事务 392 14.7 订单录入模式 393 14.8 活动事务 399 14.9 使用保存点 400 14.10 序列化事务 403 14.11 隔离...
事务处理函数transaction与executeSQL解析.docx
oracle数据库事务的概念和相关概念,以及事务级别的划分。分别介绍了jdbc事务和jta事务。
Oracle Exchange XML Transaction Delivery Guide for Marketplace Exchange Release 6.2.3
在触发器中使用自制事务及调用存储过程 Declare Pragma Autonomous_Transaction; ...
步步为营C#技术漫谈七、事务处理(Transaction)[借鉴].pdf
oracle 触发器 调用 存储过程 Oracle自治事务(Autonomous Transaction)
ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分,用来记录该块所有发生的事务,一个itl可以看作是一个记录,在一个时间,可以记录一个事务(包括提交或者未提交事务)。当然,如果这个事务已经...
set { this.m_CreateTime = value; this.OnPropertyChanged( "CreateTime", value ); } } public bool IsActive { get { return this.m_IsActive; } set { this.m_IsActive = value...
Oracle Healthcare Transaction Base Implementation Guide Release 11i Part No. B13734-01