`
zhouchaofei2010
  • 浏览: 1106963 次
  • 性别: 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 事务处理中执行插入/删除/更新操作

分享到:
评论

相关推荐

    05oralce的事务 PPT

    在Oracle数据库系统中,事务是数据库操作的基本单元,它封装了一组逻辑...通过理解并熟练运用事务的开始、提交、回滚以及只读事务,开发者能够更好地控制和管理数据库操作,同时利用SQL函数实现更复杂的数据处理逻辑。

    oracle事务处理

    Oracle 事务处理是数据库管理中...总的来说,Oracle的事务处理机制是确保数据库操作正确性和一致性的重要工具,通过合理使用提交、回滚、保存点以及只读事务,可以有效地管理复杂的数据库操作,并保证数据的准确无误。

    SQL server中的事务

    在SQL Server数据库管理系统中,事务是一种非常重要的概念,它保证了数据库操作的完整性和一致性。本章节的内容主要围绕事务、游标和锁三个数据库操作相关的知识点进行展开,目的是帮助读者深入理解这三个概念,并...

    SQL Server -事务和游标

    在SQL Server数据库管理系统中,事务和游标是两个非常重要的概念,它们对于数据操作和处理具有深远的影响。本文将深入探讨这两个主题,并解释如何利用它们解决日常数据库管理中遇到的复杂问题。 首先,我们来谈谈...

    spring学习笔记事务的

    - **readOnly**:表示事务是否为只读事务,默认值为false。 - **timeout**:事务超时时间,单位为秒,默认值为-1,表示使用数据库的默认超时时间。 - **noRollbackFor**:用于指定不回滚的异常类型列表。 #### 三、...

    Spring学习笔记之九--声明式事务

    注解中还可以设置不同的属性,如propagation(事务传播行为)、isolation(隔离级别)、timeout(超时时间)和read-only(只读事务)等,以满足不同场景的需求。 例如,在一个简单的Spring MVC应用中,你可能会在...

    spring 事务详解

    综上所述,Spring 事务管理提供了一套完整的解决方案,包括不同的传播行为、隔离级别和只读标志等特性,可以帮助开发者更灵活地控制事务的行为,从而更好地满足不同业务场景的需求。在实际应用中,选择合适的事务...

    SQL Server 事务 游标 基本语法操作实例 全SQL语句

    在SQL Server数据库管理系统中,事务和游标是两个重要的概念,它们在数据处理和操作中起着关键作用。本文将详细讲解这两个主题,并通过具体的SQL语句实例来演示其基本语法和操作。 **一、SQL Server事务** 事务是...

    sql事务和游标课件及题目

    在SQL(结构化查询语言)中,事务和游标是两个重要的概念,它们在数据库管理和应用程序开发中扮演着至关重要的角色。本课件主要聚焦于这两个主题,旨在帮助你深入理解它们的工作原理以及如何在实际操作中应用。 ...

    mysql索引、触发器、事务、存储过程说明

    - **MyISAM**:这种引擎非常适合于只读或写入较少的应用程序,因为它的批量插入速度非常快,但它不支持事务处理,并且在执行写操作时会锁定整个表。 - **InnoDB**:这是MySQL的默认存储引擎,它支持事务处理、外键...

    SQLServer 2008中通过DBCC OPENTRAN和会话查询事务

    在SQL Server中,事务分为几种类型,包括读写事务(1)、只读事务(2)、系统事务(3)和分布式事务(4)。事务的状态也有多种,如未完全初始化(0)、已初始化但未开始(1)、活动状态(2)和已结束(3)等。在事务...

    Oracle 12c受限模式 只读模式 静默模式 延迟模式

    - 正在执行的事务也可能会被挂起,直到事务提交或回滚。 - 在RAC环境中,启用静默模式会影响到集群中的所有节点。 - 可以通过查询`V$BLOCKING_QUIESCE`视图来查看哪些会话因为静默模式而被阻塞。 #### 四、延迟模式...

    oracle数据库的并发控制.docx

    只读事务可以通过`SET TRANSACTION READ ONLY`语句创建,并且可以通过`COMMIT`、`ROLLBACK`或DDL语句来结束。 ##### 6. 事务一致性的级别 事务一致性级别定义了对数据质量和并行能力的影响程度。Oracle支持以下几...

    SQL2008中通过DBCC OPENTRAN和会话查询事务

    此外,sys.dm_exec_requests视图可以提供关于当前请求(如事务)的详细状态,而sys.dm_tran_active_transactions则能提供事务本身的详细信息,如事务开始时间及事务类型(读/写事务、只读事务、系统事务或分布式事务...

    oracle数据库教学

    此外,Oracle还支持设置事务为只读模式,通过SET TRANSACTION READ ONLY命令,事务只能执行查询操作,不能进行任何数据修改,这对于数据的稳定视图和历史数据的分析非常有用。 总的来说,Oracle数据库的事务处理和...

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

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

    Oracle数据库学习笔记(来自韩顺平 Oralce视频教程)

    通过设置只读模式,可以保证在某个事务执行过程中数据不会被意外修改,这对于数据仓库和报表生成等场景非常有用。 五、ORACLE函数的使用 Oracle提供了丰富的内置函数,可以用于数据处理和计算。这些函数包括字符串...

    Sql常用技术

    游标的类型包括只读、可写、可定位和可滚动,每种类型有不同的操作能力。 接下来,我们讨论**C#页面缓存**。在Web开发中,页面缓存是提高应用程序性能的有效手段。C#中的System.Web命名空间提供了HttpCache类,用于...

    现代数据库

    7. **只读事务处理**:只读事务不会改变数据库状态,因此可以放松某些并发控制限制,提高系统性能。但仍然需要确保其在并发环境中的一致性。 8. **原子提交协议**:原子提交是确保事务要么全部完成,要么全部不完成...

    spring学习文档

    TransactionDefinition 用于描述事务的隔离界别、超时时间、是否只读和传播规则等控制事务具体行为的事务属性。PlatformTransactionManager 是整个事务控制的核心类,它会根据 TransactionDefinition 定义的事务属性...

Global site tag (gtag.js) - Google Analytics