一致性读是oracle区别于其他数据库的重要特点之一,但一般来说,这个一致性读是sql级别的,只针对单个sql有效。

由于业务逻辑需要,我们可能需要在一个事务中的多个sql也能实现读一致性,也就是说,数据源在事务开始时就定下来了,不受其他会话影响。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);

6 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

4 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;

事务处理集。

suk@ORA10G> delete from test;

delete from test

*

第 1 行出现错误:

ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作

oracle只读事物,oracle的只读事务相关推荐

  1. Oracle 11g新特性之--只读表(read only table)

    Oracle 11g新特性之--只读表(read only table)       Oracle11g推出了一个新的特性,可以将table置于read only状态,处于该状态的table的不能执行 ...

  2. Oracle 11g 新特性:只读表(Read-only)

    Oracle 11g 新特性:只读表(Read-only) Oracle11g推出了一个新的特性,可以将table置于read only状态,处于该状态的table的不能执行DML操作和某些DDL操作 ...

  3. Oracle: 三、Oracle的隐藏事务与视图的创建

    内容简介 1,Oracle的隐藏事务.2,视图(View)的创建. 技术与环境 操作系统: windows 语言类别: SQL之PL/SQL thankyou: sunshine, 谢谢你的默默付出 ...

  4. oracle 开始一个事务,oracle的启动与关闭原理-事务commit或者rollback

    oracle的启动与关闭原理-事务commit或者rollback 4.事务 4.1事务的概念 从第一个DML语句开始执行,以rollback或者commit为结束标记,之前所有的DML操作(inse ...

  5. oracle repeatable read,Oracle和Mysql中的数据库事务有关问题:Mysql Read-Repeatable有有关问题...

    Oracle和Mysql中的数据库事务问题:Mysql Read-Repeatable有问题 今天不知不觉想到数据库的乐观锁和悲观锁,遂想写个程序测测,却发现了另一个问题,Mysql InnoDB的R ...

  6. Oracle实例和Oracle数据库(Oracle体系结构)

    --========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --==================== ...

  7. oracle通过数据字典查看序列,oracle数据字典,oracle字典

    oracle数据字典,oracle字典 一.数据字典 数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询.数据字典是oracle数据库系统的信息核心, ...

  8. oracle 快速上手,Oracle学习笔记:快速上手

    开启服务:先开启Lisenterner服务 再开启ORCL服务 oracle登录 用户: - 管理员 sysDBA - 无密码 - 系统用户 system - manager - 普通用户 scott ...

  9. Oracle 概念(Oracle 10.2)

    1.Oracle介绍 本章提供了针对Oracle数据库服务器的概述,包含以下主题 Oracle数据库体系结构 Oracle数据库特点 Oracle数据库应用开发 Oracle数据库体系结构 Oracl ...

最新文章

  1. PNAS | 根际植保素合成调控细菌对植物的促生长作用
  2. 学习鸟哥的Linux私房菜笔记(1)——Linux系统入门
  3. shell awk sed tr grep 语法汇总
  4. 项目中的模块剥离成项目_使用MCEBuddy 2从电视录制中剥离广告
  5. LeetCode 672. 灯泡开关 Ⅱ(枚举)
  6. VS2010 MFC多文档中的工具栏CMFCToolBar停靠的问题
  7. 360互联网技术训练营第七期 -“遇见”PIKA 续集
  8. 【Android】 认识反射机制(Reflection)
  9. Android 仿360桌面小人
  10. oracle中的aix,oracle在AIX下的自启动
  11. 美观!!大气!!! LVGL『Color picker颜色选择器控件』介绍
  12. 求字符串长度的函数的几种实现方法
  13. 验证离散数学中的关系的相关性质(自反性,对称性,反自反性,发对称性,传递性)通过关系矩阵的方法
  14. 自制hdmi线一头改vga图_杀鸡取卵 | 破拆电脑VGA电缆获取收音机天线零件:双目铁氧体磁芯...
  15. 数据文件online和offline
  16. 姜小白的Python日记Day15 系统模块详解2 sys模块和os模块
  17. HEVC代码学习15:AMVP相关函数
  18. 小程序 wxml里时间戳转日期
  19. 二叉树、BTree、B+Tree
  20. P2P平台方案——亿网软通“互联网+”金融解决方案

热门文章

  1. mysql-修改密码(error-1290 (HY000): The MySQL server is running with the --skip-grant-tables option so)
  2. 制作 小 linux 教程,用BusyBox制作Linux最小系统
  3. css3 filter url,CSS3 filter(滤镜) 属性
  4. MySQL 删除存储过程
  5. python正则匹配ip_[求助] 正则表达式匹配 IP 地址的问题求助
  6. oracle数据如何获取游标中动态字段_原来Python自带了数据库,用起来真方便!
  7. 【OpenCV 例程200篇】20. 图像的按位运算
  8. java数组个数无限_基于Java代码实现数字在数组中出现次数超过一半
  9. int mysql_「MYSQL」MYSQL中的int(11)到底代表什么意思?
  10. 三维重建 几何方法 深度学习_基于深度学习的三维重建算法:MVSNet、RMVSNet、PointMVSNet、Cascade系列...