`
zhouchaofei2010
  • 浏览: 1086282 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

只读事务(很有用的哦) (转)

 
阅读更多

一致性读是oracle区别于其他数据库的重要特点之一,但一般来说,这个一致性读是sql级别的,只针对单个sql有效。
由于业务逻辑需要,我们可能需要在一个事务中的多个sql实现读一致性,也就是说,数据源在事务开始时就定下来了,不受其他会话影响。如:机票代售点每天18点开始统计一天的销售情况,此时就可以使用只读事务。oracle的只读事务可以实现这个功能,它可以在事务级别上实现读一致性。

 

看下面的实验:
SQL> select * from t1;

ID
---------------------------------------
1

SQL> set serverout on
SQL>
SQL> create or replace procedure p_test is
2 l_id int;
3 begin
4 select id into l_id from t1;
5 dbms_output.put_line(l_id);
dbms_lock.sleep(15);
7 select id into l_id from t1;
8 dbms_output.put_line(l_id);
9 end p_test;
10 /

Procedure created

SQL> exec p_test;

--在p_test运行期间(执行dbms_lock.sleep时),修改t1的数据:
SQL> update t1 set id=2;

1 row updated

SQL> commit;

Commit complete

--以下是输出结果
1
2

可以看到,由于第二次读取t1表的数据时,由于有其他会话修改并提交了t1表的数据,所以第二次得到的结果是2.

我们对这个p_test做一个简单的修改,设置只读事务
SQL> create or replace procedure p_test is
2 l_id int;
3 begin
set transaction read only;
5 select id into l_id from t1;
6 dbms_output.put_line(l_id);
7 dbms_lock.sleep(15);
8 select id into l_id from t1;
9 dbms_output.put_line(l_id);
10 end p_test;
11 /

Procedure created

SQL> exec p_test;

--在p_test运行期间(执行dbms_lock.sleep时),修改t1的数据:
SQL> update t1 set id=3;

1 row updated

SQL> commit;

Commit complete
--以下是输出结果
2
2

可以看到,虽然第二次读取t1表的数据前,已经有其他会话修改并提交了t1表的数据,但第二次得到的结果仍然是2.
这就是只读事务的功能,它在整个事务中保证一致性读:在整个事务中的数据在事务开始时就决定,即使有其他会话在事务周期内修改并提交数据,也不会影响事务。可以认为在只读事务周期内,其他事务的对数据的改变就像不存在一样。

在显式提交或者回滚后、或执行ddl后,结束只读事务。

需要注意:因为只读事务的原理是读取undo中数据的前镜像来实现一致性读的,所以,只读事务运行时间不能过长,否则会报0ra-01555。

还有一点,只读事务下是不能对数据做修改的
suk@ORA10G> set transaction read only;

事务处理集。

 

转:http://blog.sina.com.cn/s/blog_b0f182290101dofh.html

suk@ORA10G> delete from test;
delete from test
*
第 1 行出现错误:
ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作

分享到:
评论

相关推荐

    Spreads.LMDB:低级零开销和最快的LMDB .NET包装器,其中包含一些对Spreads有用的其他本​​机方法

    Linux 视窗苹果点差低级别的零开销和 LMDB .NET包装与有用的一些额外的本地方法。 在NuGet上以。... 可以从异步代码中使用读取事务,这需要对环境强制使用属性: 线程可以使用并行只读事务。 如果用

    sesametools:与OpenRDF Sesame一起使用的实用程序的集合(最近,Eclipse RDF4J)

    对于简单的访问控制很有用。 DeduplicationSail :一个避免重复语句的Sail实现。 与三重存储(例如AllegroGraph)一起使用,否则允许重复。 :一种RESTful Web服务,用于将芝麻数据存储发布为链接数据 ...

    sql server数据库高可用日志传送的方法

    一. 日志传送概述 SQL Server使用日志传送,可以自动将主服务器的事务日志... 允许用户定义日志发送的延迟时间(如果主数据库上的数据被意外更改,则较长的延迟会很有用) 术语和定义  备份作业  主服务器的代理

    oracle动态性能表

     V$SYSSTAT中包含多个统计项,这部分介绍了一些关键的v$sysstat统计项,在调优方面相当有用。下列按字母先后排序: 数据库使用状态的一些关键指标:  CPU used by this session:所有session的cpu占用量,不包括...

    PHP和MySQL Web开发第4版pdf以及源码

    2.7.1 以只读模式打开文件:fopen() 2.7.2 知道何时读完文件:feof() 2.7.3 每次读取一行数据:fgets()、fgetss()和fgetcsv() 2.7.4 读取整个文件:readfile()、fpassthru()和file() 2.7.5 读取一个字符:fgetc...

    PHP和MySQL WEB开发(第4版)

    2.7.1 以只读模式打开文件:fopen() 2.7.2 知道何时读完文件:feof() 2.7.3 每次读取一行数据:fgets()、fgetss()和fgetcsv() 2.7.4 读取整个文件:readfile()、fpassthru()和file() 2.7.5 读取一个字符:fgetc() ...

    PHP和MySQL Web开发第4版

    2.7.1 以只读模式打开文件:fopen() 2.7.2 知道何时读完文件:feof() 2.7.3 每次读取一行数据:fgets()、fgetss()和fgetcsv() 2.7.4 读取整个文件:readfile()、fpassthru()和file() 2.7.5 读取一个字符:fgetc...

    ORACLE9i_优化设计与系统调整

    §12.6 分离事务(Discrete Transactions ) 149 §12.7 测试SQL语句性能 151 §12.7.1 SQL_Trace实用工具 151 §12.7.2 TKPROF实用程序 151 §12.8 使用SQL_Trace和TKPROF 151 §12.8.1 设置跟踪初始化参数 152 §...

    MySQL中文参考手册

    o 1.8 有用的MySQL相关链接 * 2 MySQL 邮件列表及如何提问或报告错误 o 2.1 MySQL邮件列表 o 2.2 提问或报告错误 o 2.3 怎样报告错误或问题 o 2.4 在邮件列表上回答问题的指南 * 3 MySQL的许可证和技术支持 ...

    MYSQL

    1.6 顺应2000年 1.7 SQL一般信息和教程 1.8 有用的MySQL相关链接 2 MySQL 邮件列表及如何提问或报告错误 2.1 MySQL邮件列表 2.2 提问或报告错误 2.3 怎样报告错误或问题 2.4 在...

    MySQL中文参考手册.chm

    1.6 顺应2000年 1.7 SQL一般信息和教程 1.8 有用的MySQL相关链接 2 MySQL 邮件列表及如何提问或报告错误 2.1 MySQL邮件列表 2.2 提问或报告错误 2.3 怎样报告错误或问题 ...

Global site tag (gtag.js) - Google Analytics