SQL与Oracle对数据库事务处理的差异性(doc8页)_第1页
SQL与Oracle对数据库事务处理的差异性(doc8页)_第2页
SQL与Oracle对数据库事务处理的差异性(doc8页)_第3页
SQL与Oracle对数据库事务处理的差异性(doc8页)_第4页
SQL与Oracle对数据库事务处理的差异性(doc8页)_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SQL和Oracle对数据库事务处理的差异性作者:Jake, 出处:IT专家网论坛,责任编辑:陈子琪,2009-10-11 13:00在吉日嘎拉的软件编程走火入魔之:数据库事务处理入门(适合初学者阅读)文章中关于MS SQL Server 和Oracle对数据库事务处理的差异性引起一些争论,因此记录我对数据 库事务处理的想法。背景在吉日嘎拉的软件编程走火入魔之:数据库事务处理入门(适合初学者阅读)文章中关于MS SQL Server 和Oracle对数据库事务处理的差异性引起一些争论,因此记录我对数据 库事务处理的想法。简介本文讲述 MS SQL Server 和Oracle对数据库事务处理的

2、差异性,以及Oracle如何对事务处理的实现。什么是事务数据库事务(Database Transaction)是一组数据库操作的处理单元。事务符合ACID的特性:Atomic :原子性,要么全部要么一无所有。All or None.Consistent: 一致性,所有依赖关系以及约束一致。Isolated:分离性,不同事务不互相影响。Durable:持久性,提交事务的数据需要持久化。为什么要使用事务实现事务主要有两大功能:1 .保证数据库的consistent 一致性状态),保持所有依赖关系以及约束一致)。哪怕数据库管理系统出现故障时(例如断电),也能恢复到一致性状态。例如一个银行转帐系统,张

3、 三给李四转3000 圆RMB ,张三帐号上减 3000和李四帐号上加 3000需要同时完成,否 则系统的帐就不平了。也例如有些销售系统的汇总表和明细表,是一个主表和一个从表,需 要同步更新。2 .并发时分离不同事务操作。例如编辑过程中的数据不给其他事务查询到。这也是相对 的,在特效需求下可能要支持dirty read( 脏t ),但不是这里讨论的范围了。SQL Server 2008 的事务类型1 .自动提交事务 Autocommit Transactions这是SQL Server 默认的事务类型,每一条单独的 SQL语句(SQL statement) 都是单 独的一个事务,语句执行完毕后

4、自动提交。调用方不需要手工控制事务流程。2 .显示事务 Explicit Transactions调用方需要调用 API或者使用T-SQL的BEGIN TRANSACTION语句来打开事务。需要调用 COMMIT 或者 ROLLBACK TRANSACTION来提交或者回滚。3 .隐式事务 Implicit Transactions使用SET IMPLICIT_TRANSACTIONS ON把事务模式变成隐式模式。调用方不需要执行BEGIN TRANSACTION语句来打开事务。数据库引擎执行到 SQL语句的时候自动打开事务。调用方需要调用COMMIT 或者ROLLBACK TRANSACTI

5、ON来提交或者回滚。当数据库引擎执行下一个SQL语句时又自动打开一个新事务。参考:Controlling Transactions (Database Engine)Oracle 的事务类型Oracle的事务处理类型有点像SQL Server 的隐式事务。当执行到第一个可执行的SQL语句时自动打开事务,然后需要调用方执行commit或者rollback来提交或者回滚事务,如果有DDL语句,Oracle也会自动提交事务的。参考:Transaction ManagementOracle的事务的实现Oracle的结构分逻辑上和物理上的区别。逻辑上的结构是表空间,而物理上的结构是数据文件。逻辑实现Or

6、acle 下实现事务在逻辑上是由Undo Tablespace 来实现的。Undo Tablespace包含 Undo Segements( 段),而 Undo Segements包含 Undo Data。Undo Data 是支持事务的逻辑单元。图源自于Oracle Database 10g: Administration Workshop I»Undo Data 用于保存修改前后的数据,以支持回滚,长时间查询,和 flashback 查询, 以及失败事务恢复的功能。由于有了 Undo Data ,回滚事务变得容易了,因为Undo Data 保存了修改前后的数据, 保证了事务的原子

7、性。失败事务恢复和事务回滚类似,当网络中断或者其他原因导致事务异常停止,数据库引擎可以恢复到一致性状态。同时Undo Data 也支持长时间查询(Read-consistent) ,例如有表格 T,主键为key , 有字段为fl ,数据如下,尽管只有 4条数据,假设需要很长时间进行查询。事务一开始查询,一直没结束,而事务二开始修改key为1的数据为Z,事务二进行提交,数据变成下面的表格。但是事务一查询结束的时候还是读出A,B,C,D ,因为查询是从Undo中读出快照。Flashback 查询是Oracle 10g 引进的功能,可以查询出提交之后修改之前的数据,例如上面例子事务三在事务二提交后想

8、查询出A,B,C,D可以通过Flashback 查询来完成。这也是有Undo Data 来支持的。物理实现从上面的逻辑实现看,只是知道了事务以及Undo Data的作用,还不清楚 Oracle对事务的支持到底怎么实现的。下面从物理结构上讲述Oracle怎么对事务进行支持。请先看一个物理结构图。图源自于Oracle Database 10g: Administration Workshop I»为了简化,我只是用个人的语言讲述和事务有关的部件。SGA可以理解为全局内存。其中Database Buffer Cache 存放的是从数据文件中读取的数据缓存。紫色的圆柱体为数据 文件。Redo

9、 Log Buffer 为重做日志缓存,也就是保存日志的内存块,一切的数据的修改都会记录在Redo Log Buffer 里面。例如用回事务二更新key为1数据的例子。当事务二更新key为1数据从A至ij Z。Oracle数据库引擎会把 key为1的数据的rowid ,修改前数据A以及修改后数据 Z都记录在Redo Log Buffer 里面。如果事务二继续更新 key为2的 数据为Y,那么key为2的数据的rowid,修改前数据B以及修改后数据 Y也记录到Redo Log Buffer里面。每一笔数据都记录,而且是流水线性记录。一旦事务二进行提交,LGWR进程(Log Writer ,日志写

10、进程)就会把Redo Log Buffer 的数据按顺序写到 Log Datafile里面,也就是日志数据文件里面,当写日志文件完成,Oracle数据库引擎会生成一个SCN( system change number ,系统更新号),到这时候 Oracle数据库引擎会通知调用方提交完成了。这里可以看到Oracle在提交的时候不必要把更新数据写回数据文件,而是写到日志文件里面。因为顺序写线性的日志文件速度快很多,而写数据文件是需要随机读写。由于线性记录和 SCN号控制,数据库引擎可以通过redo log(重做日志文件)的操作得到最新的数据。当然在 Checkpoint的时候数据文件是最终还是会更

11、新的,只是说事务提交的时 候更新数据文件不是必须步骤,这样能很大的提高性能。由于这个机制,回滚变得很简单,要读没提交前之前的SCN是很容易的事情。对于初学者关于数据库事务处理的建议我自己也是从新手一步步走过来,现在也不是老鸟,算是有点经验,如果是刚入门的同学,你觉得有用就看一下,没用就过了。对于数据库事务的处理,开始的时候不需要很深入了解数据库的原理,当然以后还是需要了解的,优先级排后而已。高优先级如下:首先,事务不是什么高深神秘的东西,我从入行开始所做的所有系统,包括现在的嵌入式系统,都用到事务。我并不觉得大部分系统事务有什么问题,只是一些约束和同步机制,真的有问题从自身系统设计角度看,不一

12、定说从数据库技术角度去找解决方法。例如Oracle的长时间查询如果 Undo Data (历史数据)给覆盖了,Oracle会抛出异常"ORA-01555:snapshot too old ,如果出现这种问题,我会从自身系统设计角度入手,为什么有那么大 的查询,为什么在这个查询中其他事务会更新数据,这些查询是否只是查一次就够了,查的过程是否需要锁住表等等。然而这个问题可以通过数据库调优解决,但是我想问题的角度首 先是从自身系统设计出发。第二,要知道的是不同数据库的事务类型的区别,例如 MS SQL Sever 是默认是自动 提交事务,用的时候需要知道每个语句都有单独的事务在操作。而 O

13、racle是类似于隐式事 务,必须手工 commit 或者rollback 。第三,使用事务要知道一一对应,特别是嵌套事务的时候,有始有终。很多问题时候发生终的时候,注意异常处理需要结束已经打开的事务。第一点是心理问题,第二三点是技术问题,做好我觉得就可以入门开发系统了。以后碰 到问题在一步步深入。MS SQL Server 对事务的实现下一篇再讲了。上述是我对 Oracle实现的理解,有不 当之处也希望指出,我可以完善文章。读一本好书,就是和许多高尚的人谈话读书时,我愿在每一个美好思想的面前停留,就像在每一条真理面前停留一样。书籍是在时代的波涛中航行的思想之船,它小心翼翼地把珍贵的货物运送给一代又一代。好的书籍是最贵重的珍宝是唯一不死的东西。书籍使人们成为宇宙的主人。书中横卧着整个过去的灵书不仅是生活,而且是现在、过去和未来文化生活的源泉。书籍把我们引入最美好的社会,使我们认识各个时代的伟大智者。书籍便是这种改造灵魂的工具。人类所需要的,是富有启发性的养料。而阅读,则正是这种养料。&不敢妄为些子事,只因曾读数行书。陶宗义我并没有什么方法,只是对于一件事情很长时间很热心地去考虑罢了。只要愿意学习,就

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论