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数据库中,事务(transaction)是指一组逻辑上相关的操作集合。这组操作要么全部成功完成,要么一个失败则全部撤销,确保数据的一致性和完整性。事务管理是数据库系统的核心功能之一。 #### 二、事务控制...
NHibernate 是一个流行的开源对象关系映射(ORM)框架,它允许开发人员使用.NET Framework 或 .NET Core 在各种数据库系统上工作,包括Oracle。Oracle 是一个功能强大的关系型数据库管理系统,广泛应用于大型企业级...
- `set transaction readonly;` 开始一个只读事务。 ### 日期函数与格式化 1. **日期格式设置** - `alter session set nls_date_format = 'YYYY"-"MM"-"DD';` 设置会话的日期格式为`YYYY-MM-DD`。 2. **日期...
此外,可使用`READONLY`关键字确保事务只读,进一步增强数据一致性。 ##### 利用游标更新数据 游标是处理数据集的一种强大工具,尤其适用于数据更新操作。示例如下: ```sql DECLARE CURSOR c1 IS SELECT * FROM ...
- 命令:`set transaction readonly;` #### SQL函数与操作符 - **系统函数** - `sys_context`: 获取数据库上下文信息。 - 示例:`select sys_context('userenv','db_name') from dual;` - **操作符** - `-`:既...
它包括三个子功能:版本查询(Versions)、事务查询(Transaction)和表级闪回(Table)。 #### 使用方法: 1. **版本查询**:展示不同时间点的记录版本。 2. **事务查询**:查看事务执行前后的影响。 3. **表级闪...
在开始之前,你需要选择一个数据库管理系统(DBMS),如MySQL、SQL Server、Oracle或SQLite。创建数据库通常涉及定义模式(Schema),包括表的结构、字段类型、主键和外键关系等。例如,你可以创建一个名为`...
使用CreateTransaction方法来获取一个ITransactionKeeper事务容器。获取到的事务容器自身也实现了IDbClient,可以在其上进行各种CRUD操作。 事务的最后,别忘了Commit。 ITransactionKeeper同时也实现了...
CURSOR=READONLY;auto=multi #hibernate.connection.username user #hibernate.connection.password password ## Mimer SQL #hibernate.dialect org.hibernate.dialect.MimerSQLDialect #hibernate.connection....
•DefaultLobHandler:适用于大部分的数据库,如SqlServer,MySQL,对Oracle 10g也适用,但不适用于Oracle 9i(看来Oracle 9i确实是个怪胎,谁叫Oracle 公司自己都说Oracle 9i是一个过渡性的产品呢)。 •...