谈谈SET TRANSACTION READ ONLY

导读:


SET TRANSACTION READ ONLY类似于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,应该没有效果。有兴趣的朋友可以进行测试。




本文转自

http://space.itpub.net/69924/viewspace-183267
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值