SQL和Oracle对数据库事务处理的差异性(4)
来源:asp之家 发布时间:2009-10-14 09:43:00
为了简化,我只是用个人的语言讲述和事务有关的部件。SGA可以理解为全局内存。其中Database Buffer Cache存放的是从数据文件中读取的数据缓存。紫色的圆柱体为数据文件。Redo Log Buffer为重做日志缓存,也就是保存日志的内存块,一切的数据的修改都会记录在Redo Log Buffer里面。例如用回事务二更新key为1数据的例子。当事务二更新key为1数据从A到Z。Oracle数据库引擎会把key为1的数据的 rowid,修改前数据A以及修改后数据Z都记录在Redo Log Buffer里面。如果事务二继续更新key为2的数据为Y,那么key为2的数据的rowid,修改前数据B以及修改后数据Y也记录到Redo Log Buffer里面。每一笔数据都记录,而且是流水线性记录。一旦事务二进行提交,LGWR进程(Log Writer,日志写进程)就会把Redo Log Buffer的数据按顺序写到Log Datafile里面,也就是日志数据文件里面,当写日志文件完成,Oracle数据库引擎会生成一个SCN(system change number,系统更新号),到这时候Oracle数据库引擎会通知调用方提交完成了。这里可以看到Oracle在提交的时候不必要把更新数据写回数据文件,而是写到日志文件里面。因为顺序写线性的日志文件速度快很多,而写数据文件是需要随机读写。由于线性记录和SCN号控制,数据库引擎可以通过redo log(重做日志文件)的操作得到最新的数据。当然在Checkpoint的时候数据文件是最终还是会更新的,只是说事务提交的时候更新数据文件不是必须步骤,这样能很大的提高性能。
由于这个机制,回滚变得很简单,要读没提交前之前的SCN是很容易的事情。
对于初学者关于数据库事务处理的建议
我自己也是从新手一步步走过来,现在也不是老鸟,算是有点经验,如果是刚入门的同学,你觉得有用就看一下,没用就过了。
对于数据库事务的处理,开始的时候不需要很深入了解数据库的原理,当然以后还是需要了解的,优先级排后而已。高优先级如下:
首先,事务不是什么高深神秘的东西,我从入行开始所做的所有系统,包括现在的嵌入式系统,都用到事务。我并不觉得大部分系统事务有什么问题,只是一些约束和同步机制,真的有问题从自身系统设计角度看,不一定说从数据库技术角度去找解决方法。例如Oracle的长时间查询如果Undo Data(历史数据)给覆盖了,Oracle会抛出异常“ORA-01555: snapshot too old”,如果出现这种问题,我会从自身系统设计角度入手,为什么有那么大的查询,为什么在这个查询中其他事务会更新数据,这些查询是否只是查一次就够了,查的过程是否需要锁住表等等。然而这个问题可以通过数据库调优解决,但是我想问题的角度首先是从自身系统设计出发。
第二,要知道的是不同数据库的事务类型的区别,例如MS SQL Sever是默认是自动提交事务,用的时候需要知道每个语句都有单独的事务在操作。而Oracle是类似于隐式事务,必须手工commit或者rollback。
第三,使用事务要知道一一对应,特别是嵌套事务的时候,有始有终。很多问题时候发生终的时候,注意异常处理需要结束已经打开的事务。
第一点是心理问题,第二三点是技术问题,做好我觉得就可以入门开发系统了。以后碰到问题在一步步深入。


猜你喜欢
- 一、逻辑数据库和表的设计数据库的逻辑设计、包括表与表之间的关系是优化关系型数据库性能的核心。一个好的逻辑数据库设计可以为优化数据库和应用程序
- 简介在Python开发和测试过程中主要有两种模式可以选择:脚本模式、命令行模式。在代码的开发和调试过程中使用脚本模式很方便,目前比较主流的命
- 1、冒泡排序它反复访问要排序的元素列,并依次比较两个相邻的元素。如果顺序(如从大到小)错了,就交换它们。访问元素的工作是反复进行,直到没有相
- 文字的多行处理在dom元素中很好办。但是canvas中没有提供方法,只有通过截取指定字符串来达到目的。那么下面就介绍我自己处理的办法:wxm
- (下面的代码原来我想用折叠的代码的,但是在google里面老是添加不了折叠的代码,所以就整屏的贴出来了,望大家不要见外。) 朋友的比较好的存
- 2020年4月4日,是个特殊的日子,我们看到朋友圈很多灰化的图片.今天我们就聊聊图片灰度处理这事儿.PIL的基本概念:PIL中所涉及的基本概
- 一、拉格朗日的基本思想拉格朗日插值法是以法国十八世纪数学家约瑟夫·拉格朗日命名的一种多项式插值方法。许多实际问题中都用
- 我就废话不多说了,直接上代码吧!#!/usr/bin/python3# -*- coding: utf-8 -*-import codecs
- pytorch geometric的GNN、GCN节点分类# -*- coding: utf-8 -*-import osimport to
- 如下所示:<?phpnamespace helpers;class OpensslRSA{ //echo $private_key 私
- 1.什么是守护进程守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会
- 虽然这种情况不应该发生,通常像我们关系型数据库,我们应该是事先设计好,以后不能改动,但是由于之前工作的疏忽,其实说实话,也不仅仅是我个人的疏
- 如果直接使用base64_encode和base64_decode方法的话,生成的字符串可能不适用URL地址。下面的方法可以解决该问题:UR
- 一、前言这几天宅在家里网上冲浪,无意间看到了一个比较有趣的项目,就是使用 Python 语言实现对视频中的人物的眨眼进行计数并描绘在图表中。
- 本文实例讲述了PHP实现ASCII码与字符串相互转换的方法。分享给大家供大家参考,具体如下:<?phpclass ascii { &n
- 本文实例讲述了Python3.5迭代器与生成器用法。分享给大家供大家参考,具体如下:1、列表生成式通过列表生成式可以直接创建一个列表。代码:
- 本文实例讲述了Python面向对象类的继承。分享给大家供大家参考,具体如下:一、概述面向对象编程 (OOP) 语言的一个主要功能就是“继承”
- 本文实例为大家分享了基于TensorFlow的CNN实现Mnist手写数字识别的具体代码,供大家参考,具体内容如下一、CNN模型结构输入层:
- 最近,我面试了一个有五年 Web 应用程序开发经验的软件开发人员。四年半来她一直在从事 JavaScript 相关的工作,她自认为 Java
- 主要有以下区别:1、MySQL默认采用的是MyISAM。2、MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默