vine's profilevine的共享空间PhotosBlogListsMore Tools Help

vine的共享空间

vine feng

Occupation
胜,不妄喜;败,不惶馁;胸有激雷,而面如平湖者,可拜上将军。
This person's network is empty (or maybe they're keeping it private).
February 19

OLTP OLAP

联机事务处理(OLTP)和联机分析处理(OLAP)的不同,主要通过以下五点区分开来。
用户和系统的面向性:
OLTP是面向顾客的,用于事务和查询处理
OLAP是面向市场的,用于数据分析
数据内容:
OLTP系统管理当前数据.
OLAP系统管理大量历史数据,提供汇总和聚集机制.
数据库设计:
OLTP采用实体-联系ER模型和面向应用的数据库设计.
OLAP采用星型或雪花模型和面向主题的数据库设计.
视图:
OLTP主要关注一个企业或部门内部的当前数据,不涉及历史数据或不同组织的数据
OLAP则相反.
访问模式:
OLTP系统的访问主要由短的原子事务组成.这种系统需要并行和恢复机制.
OLAP系统的访问大部分是只读操作


OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。
OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。

下表列出了OLTP与OLAP之间的比较:

 

OLTP

OLAP

用户

操作人员,低层管理人员

决策人员,高级管理人员

功能

日常操作处理

分析决策

DB 设计

面向应用

面向主题

数据

最新的,细节的,二维的,分立的

历史的,聚集的,多维的,集成的

存取规模

读/写数条(甚至数百条)记录

读上百万(甚至上亿)条记录

操作频度

非常频繁(以秒计)

比较稀松(以小时甚至以周计)

工作单位

严格的事务

复杂的查询

用户数

数百个-数千万个

数个-数百个

DB 大小

100MB-GB

100GB-TB

 
 
December 17

故事

    法国著名作家雨果曾说:“世界上最宽阔的是海洋,比海洋更宽阔的是天空,比天空更宽阔的是人的心灵。”心旷为福之门,心狭为祸之根。心胸坦荡,不以世俗荣辱为念,不为世俗荣辱所累,就活得轻松、潇洒、磊落;心胸狭窄,一事不顺,便心存憎恨,一句话不顺,就耿耿于怀。心灵上栽满荆棘,思想上遮满云雾,整日郁郁,常年忧虑,就无异于自戕自害。中国人津津乐道:“将军额上能跑马,宰相肚里能撑船”,“风物长宜放眼量”,“留得青山在,不怕没柴烧。”人靠智慧的灵气、人品的高尚活着,不只是为了一时的显赫或地位而活着。大智者宁争一分才华的短长,不争一寸名分的高低。因为才华与生命价值成正比,而名分是虚幻的,不能与生命的价值等量齐观,更不必为此劳神伤感失望。要走出狭隘的“牢笼”,走进那灵气可以自由发挥、心灵免遭无端伤害的“君子坦荡荡”的大世界。

    宽容的人善于站在对方的立场着想,善于设身处地地为别人着想,尊重他人,用自己开阔的心胸容纳别人,原谅别人对自己的伤害。狭隘的人则不然,常常对自己的错误熟视无睹,对别人的小小过失却锱铢必较甚至睚眦必报。这样不但对方改正不了错误,反而积怨越来越深,正所谓“冤家宜解不宜结”。每个人都应培养宽容的心胸,彼此容纳,互相谅解,我宽容别人,别人也宽容我,形成一种良好的宽容氛围。

    东晋著名的大将褚衰,有一次坐船去送一位客人去浙江,晚上投宿在钱塘县的驿亭中。可是不巧,这天晚上钱塘县令也正好送客人来到这里,亭吏不认识褚衰,所以为了招待县令,就把褚衰赶了出去。褚衰既不解释,也不争辩,拿起行李就来到江边的牛屋住下了。不久,钱塘潮水涨起,县令沈充观潮来到此处,远远地看见牛屋里竟住着人,就感到很奇怪,忙问亭吏是怎么回事。亭吏如实回答说:“昨天有一个北方人来投宿,因为你们这些嘉宾光临,所以只好叫他住在那里了。”沈充于是傲慢地叫道:“嘿,北方佬,过来吧,快快报上你的姓名,我可以给你一些饼子吃。”褚衰大小也是个人物,受到别人如此嘲弄,心里的滋味可想而知了。可他还是不亢不卑地回答:“我是河南的褚衰。”短短的一句话,一下子就把沈充镇住了。沈充当然知道褚衰的大名,现在把褚衰冒犯了。他非常恐慌,很希望褚衰能痛斥自己和那个亭吏一顿,但他见褚衰一句责难的话也不说,只好命令手下的人鞭打亭吏,但没想到却被褚衰阻止了,于是他又只好吩咐手下杀鸡宰羊,盛宴款待褚衰,并负荆请罪。褚衰为了不使沈充难看,毫不犹豫地赴宴。酒宴上,沈充一个劲儿地赔不是,褚衰却表现得毫不计较。

    从这个故事里,不难看出沈充的心胸狭窄和褚衰的宽容大度。

    狭隘的人往往对别人抱有成见,总戴着有色眼镜去看周围的人。看什么都不顺眼,愤世嫉俗,永远觉得命运对自己不公平,总把错误推给别人,从年轻愤怒到老。遇上有人过得好,都想咬人一口,斜视久了的眼睛看什么都不顺眼。其实没有必要把自己想象成世界上最不幸的人。有委屈,可以大哭一场;想乐时,不妨大笑几声。

    有这样一个小故事:有个太太多年来不断地抱怨对面的太太太懒惰,“那个女人的衣服永远也洗不干净,看,她晾在院子里的衣服,总是有斑点。我真的不知道,她怎么连洗衣服都洗成那个样子。”直到有一天,有个明察秋毫的朋友到她家,才发现不是对面的人衣服洗不干净。细心的朋友拿了一块抹布,把这个太太的窗户上的灰渍抹掉,说:“看,这不就干净了吗?”原来是自己家的窗户脏了。狭隘的人是不是能从这个故事里悟出点什么?

    从心理学角度看,狭隘往往是一个人因为某些生理缺陷或其他因素而产生轻视自己,认为自己各方面都不如他人的情绪体验,所以为了不暴露自己的缺陷,只有讳病忌医,采用鸵鸟政策,即像鸵鸟那样,一遇威胁时,总是千方百计地把头和前身躲藏起来,而不顾露在外面的屁股。

    狭隘的人缺乏友善、宽容之心,他们容不得别人的进步或获利,容不得别人超过自己,因此面对别人的成功,他就气极眼红,嫉恨对方,自己伤害了自己的身体。他们更容不得别人对自己的批评,他们心中无正事,骨中无正气,只注重个人的利益。“机关算尽太聪明,反误了卿卿性命”,自以为很聪明,不知恰恰是愚蠢之极。

    有一次,一个很傲慢的观众在演出的幕间休息时,走到俄罗斯著名的马戏丑角杜罗夫身旁,讥讽地问道:“丑角先生,观众对你非常欢迎吧?”“还好。”“是不是如果想在马戏班中受到欢迎,丑角就必须具有一张愚蠢而丑怪的脸蛋呢?”“确实如此。”杜罗夫回答说,“如果我能生一张您那样的脸的话,我一定能拿到双薪。”

    有一个不甘安于现状的农民,对自己的玉米田收成很不满意,于是四处打听,买来优质玉米种子,果然获得了大丰收。他的邻居在惊羡之余,都托他帮助买些新种子,可是这个农民为了保住自己的优势,拒绝了邻居们的要求。不知为什么,从第二年开始,他的玉米收成差了,到了第三年产量更是明显减少,最后他终于找到了原因,原来他的优质玉米,接受的却是邻居地里劣等玉米的花粉。

--------------------------------------------------------------------------------

    感触:挺长时间以来,觉得自己就挺小气的,心胸不够宽广,容不下一些东西。秉着自己年少,就总自以为是,这是不好的。很多人都说,要经历一些事情,才能长大,能慢慢的成熟,懂事。可我不这么认为,我想尽快的改变自己这种幼稚的心态。因为不想让别人觉得我很可笑。不想过些年自己回过头也觉得自己那时候很幼稚。或者是我工作中同事年纪都比我大一些吧,我觉得他们每个人为人处世,都有自己的特点,但是,他们比我要镇定,什么事都大多顾全大局。这么长时间以来,和这帮同事,我总是尽量掩饰自己的年少无知,总是去想,如何和他们更好的交流,并成为朋友。但我不知道我做的好不好。别人叫我小孩其实无所谓,关键是工作上,工作的态度呀,什么的,不要带着情绪,尽量要让自己高兴,这样才能把工作做好,赢的大家的信任。大部分我是这样的,但还是有时候做的不好,尤其最近,一些事情让我很想发泄一下,我尝试和一些同事说,但他们觉得我做的不好。我开始觉得他们不理解我,但慢慢看来,还是我错了。原来他们都是将军,都是宰相。啊,我多么想成为一个宰相。

    另外,最近玩游戏也遇到类似的问题,再一次看出来我的心胸不够宽广。游戏里,常常大家是一个团队,一起玩,本来挺好,挺开心的,但我还是很多地方,为人处世的地方做的不好,让大家觉得我不可靠,不值得信任,反而我像小人了。GF也不喜欢我玩游戏,常因为这个事情闹矛盾。看来还是要个时间休息休息吧,毕竟这种生活一直过下去也不是办法。

 

November 04

无法承受之轻

华龙R海波
初中同学聚会,这照片实在太好玩了。田园风光,会有回忆,有感触~~
 
October 23

oracle单引号的处理

     要插入一个字符串,字符串可能包含有单引号。那么,把单引号替换成空,然后插入。
     很多人都在字符串上想办法,比如一个已知的字符串是"aa'bb'cc",现在要把他插入到oracle中,通常的做法是
SQL> create table b (cd varchar2(40));
 
Table created
 
SQL> select * from b;
 
CD
----------------------------------------
 
SQL> insert into b values (replace('aa'bb'cc','''',''));
 
insert into b values (replace('aa'bb'cc','''',''))
 
ORA-00907: 缺失右括号
 
由此可见,通常的替换会导致失败,那么如何做呢?注意不要从字符串上想办法,比如把语句写成
insert into b values(replace('aa''bb''cc','''',''));
这违背了题目的意思。
所以这里使用了oracle的字符处理函数,即:
SQL> insert into b values (replace(q'<aa'bb'cc>','''',''));
 
1 row inserted
 
SQL> select * from b;
 
CD
----------------------------------------
aabbcc
或者
SQL> insert into b values (replace(q'<aa'bb'cc>',chr(39),''));
 
1 row inserted
 
SQL> select * from b;
 
CD
----------------------------------------
aabbcc
aabbcc
 
这里q'<>'将括起来的内容中包含的单引号不当作结束符来处理。
 
 
 
 

5.1 方案对象简介

     方案(schema)是一个逻辑数据结构(logical structures of data)(或称为方案对象(schema object))的集合。每个数据库用户拥有一个与之同名的方案,且只有这一个方案。方案对象可以通过 SQL 语句创建和操作。可以包含于方案的对象类型有:
     1. 簇(cluster)
     2. 数据库链接(database link)
     3. 数据库触发器(database trigger)
     4. 维度(dimension)
     5. 外部过程库(external procedure library)
     6. 索引(index)和索引类型(index type)
     7. Java 类(Java class),Java 资源(Java resource),及Java 源程序(Java source)
     8. 物化视图(materialized view)及物化视图日志(materialized view log)
     9. 对象表(object table),对象类型(object type),及对象视图(object view)
     10. 操作符(operator)
     11. 序列(sequence)
     12. 存储(在服务器端)的(stored)函数(function),过程(procedure),及包(package)
     13. 同义词(synonym)
     14. 表(table)及 index-organized table
     15. 视图(view)
     还有一些类型的对象也存储于数据库中,且可由 SQL 语句创建或操作,但是他们并不属于任何方案(schema):
     1. 上下文(context)
     2. 目录(directory)
     3. 用户配置(profile)
     4. 角色(role)
     5. 表空间(tablespace)
     6. 用户(user)
     方案对象(schema object)是一种逻辑数据存储结构(logical data storage structure)。Oracle 在逻辑上将方案对象存储于数据库的表空间(tablespace)中,而方案对象的数据在物理上存储于此表空间的一个或多个数据文件(datafile)中。因此方案对象不一定与磁盘上存储其数据的物理文件(physical file)一一对应。用户可以对表(table),索引(index),及簇(cluster)等对象的磁盘空间分配进行设定。
     方案(schema)与表空间(tablespace)之间没有必然联系:同一表空间可以包含属于不同方案的对象,而同一方案内的对象也可以存储在不同表空间中。
     SYSTEM 表空间内包含了数个表及索引对象,而用户数据表空间内则包含了表,索引,及簇等对象。
     SYSTEM 表空间存储在数据文件(datafile)DBFILE1 中,这个文件物理上存储于磁盘组 Disk Drive 1 的一个磁盘中。用户数据表空间存储在数据文件 DBFILE2 和 DBFILE3 中,这些数据文件存储在磁盘组 Disk Drive 1 的两个磁盘内,其中包括了 SYSTEM 表空间使用的磁盘。
 
October 22

没时间

这三个星期都要业务和技术培训,没有时间学习,更新又被迫停止。。
哎。
October 16

4.3 自治事务概述

     如果一个事务(transaction)在另一个事务中被调用,那么这个独立的事务被称作自治事务。(autonomous transaction)。用户使用自治事务可以暂时脱离其调用者的事务上下文环境,在一个新的事务中执行一系列的SQL操作(在自治事务内可以对这些操作进行提交与回滚),自治事务结束后还可以返回调用者事务的上下文环境继续执行。
     自治事务(autonomous transaction)被调用后与发起调用的事务(transaction)完全独立。她看不到调用者事务内任何未提交(uncommitted)的数据修改,也不能共享调用者事务使用的锁(lock)和其他资源。自治事务提交后,其中所做的数据修改即对其他事务有效。
     自治事务(autonomous transaction)中可以再调用其他自治事务。除了资源上的限制,自治事务调用的嵌套层次没有限制。
     自治事务(autonomous transaction)与其调用者之间可能会产生死锁(deadlock)。Oracle 会检测此类死锁并返回错误信息。但应用程序开发者应该避免此类死锁的发生。
     例如:存储过程A是一个事务,在A的过程中调用了存储过程B。
     1. 这时B过程就称为一个自治事务。
     2. B过程执行完成后可以继续执行A过程。
     3. B过程可以提交或者回滚。其回滚和提交操作只对自身有效,对A过程无效。
     4. B过程执行对A过程并不产生影响。B过程看不到A过程中任何未提交的数据修改,也无法共享A过程使用的锁和其他资源。
     5. B过程commit后,其中所做的数据修改对其他事务有效。
     6. B过程中可以再调用其他事务,比如调用过程C。
     7. A与B,B与C之间可能会产生死锁,但A与C不会。Oracle会检测此类死锁并返回错误信息。
     有些情况下,无论调用者事务是提交(commit)或回滚(roll back)都需要执行某些独立的操作,此时适合使用自治事务(autonomous transaction)。较长见的应用是事务日志(transaction logging),及重试计数(retry counter)。
4.3.1 自治的PL/SQL程序结构
     用户可以通过 pragma 指令 AUTONOMOUS_TRANSACTION 将一个 PL/SQL 程序结构设定为自治事务(autonomous transaction)。pragma 是一个编译器指令(compiler directive)。用户可以将以下类型的 PL/SQL 程序结构定义为自治的:
     1. 服务器端(stored)的过程(procedure)或函数(function)
     2. 本地的(local)过程或函数
     3. 包(package)
     4. 类型方法(type method)
     5. 顶级匿名块(Top-level anonymous block)
     当一个自治的 PL/SQL 程序结构开始运行时,调用者的事务上下文环境(transaction context)就被挂起。这保证了自治程序结构(或由此自治程序结构调用的其他结构)内的 SQL 操作与调用者的事务上下文环境相独立,且不会对其产生影响。
     当一个自治程序结构(autonomous block)调用其他程序结构或其自身时,被调用的程序结构不会与调用者共享任何事务上下文环境(transaction context)。但当一个自治程序结构调用一个非自治程序结构(non-autonomous block)时,被调用的程序结构将继承调用者的事务上下文环境。
4.3.1.1 自治程序结构中的事务控制语句
     自治 PL/SQL 程序结构内的事务控制语句(transaction control statements)仅对当前的自治事务(autonomous transaction)有效。这些控制语句包括:
     1. SET TRANSACTION
     2. COMMIT
     3. ROLLBACK
     4. SAVEPOINT  
     5. ROLLBACK TO SAVEPOINT
     同样,一个事务(transaction)内的事务控制语句(transaction control statements)也仅对其自身有效,而不会作用于被其调用的自治事务(autonomous transaction)。例如,将一个事务回滚到调用自治事务之前的某个保存点(savepoint),并不会撤消(undo)被调用的自治事务内的任何操作。
 

安装程序无法复制一个或多个文件。特定错误码是0x4b8

安装程序无法复制一个或多个文件。特定错误码是0x4b8。
 
故障现象

安装IIS的时候一直提示如下错误,IIS无法正常安装。提示:安装程序无法复制一个或多个文件。

特定错误码是 0x4b8。按“确定”以继续;或者按“取消”,停止安装并且再试一次。如果继续,组

件可能无法正常运行。

解决方案

(1) 开始 > 运行 > 输入 CMD >再输入以下命令:
esentutl /p %windir%/security/database/secedit.sdb,
然后再安装一次,就搞定了。修复了安装IIS组件需要的系统数据库。
 
这里的esentutl是一个系统的修复工具。主要用于修复系统的数据库。
在Windows系统中,包含了多个数据库,最主要的数据库就是注册表,还包含了很多其他的数据库,他们都以系统数据库文件的形式保存,其后缀名为SDB。
ESEnTUtl运行有几种模式。每种模式对SDB文件执行不同的任务。这里是每种模式的语法:
Defragmentation  :  ESEnTUtl /d <database name> [options]
碎片整理模式        :  ESEnTUtl /d <数据库文件名> [选项]
Recovery      :      ESEnTUtl /r [options]
恢复模式        :      ESEnTUtl /r [选项]
Integrity        :      ESEnTUtl /g <database name> [options]
完整性检查模式 :      ESEnTUtl /g <数据库文件名> [选项]
Repair         :      ESEnTUtl /p <database name> [options]
修复模式       :      ESEnTUtl /p <数据库文件名> [选项]
Checksum       :      ESEnTUtl /k <database name> [options]
校验模式          :      ESEnTUtl /k <数据库文件名> [选项]
File Dump        :     ESEnTUtl /m [mode-modifier] <filename>
文件转储模式     :     ESEnTUtl /m[模式修改符] <文件名>

上述选项根据模式而不同。然而,有些选项在所有模式中通用。这里是通用选项:

/8            定义数据库分页大小为8KB。正常情况下,ESEnTUtl自动检测分页大小。只有当微软知识库告诉你或者读取数据库遇到问题时才使用该选项。

/o            禁用微软徽标。你可以用该选项来创建报表输出或者作为另一个数据库的输入。

/s <流文件名>        为流数据输出设置文件名。默认设置是NONE。当你想用流数据技术——而不是简单的转储——来发送数据时使用该选项。该选项适用于碎片整理、完整性检查、修复以及文件转储模式。

/t <数据库文件名>    设置临时数据库文件名。默认设置是TEMP-DFRG*.EDB。通常,你无需更改数据库文件名因为ESEnTUtl已经支持多个临时数据库。该选项适用于碎片整理、完整性检查以及修复模式。

注意:某些模式针对不同的目的使用同样的选项开关。因此,不要假定在碎片整理模式中的/f开关和完整性检查模式的/f开关执行同样的任务。
 
October 15

4.2 事务管理概述

     在 Oracle 中一个事务(transaction)开始于首个可执行的 SQL 语句(executable SQL statement)。可执行的 SQL 语句指产生了对实例(instance)的调用(call)的 SQL 语句,包括 DML 和 DDL 语句。
     当一个事务(transaction)开始时,Oracle 为此事务分配一个可用的撤销表空间(undo tablespace)来记录其产生的回滚条目(rollback entry)。
     一个事务(transaction)在满足以下条件之一时结束:
     1. 用户提交了 COMMIT 语句,或不包含 SAVEPOINT 子句的 ROLLBACK 语句。
     2. 用户执行了 CREATE,DROP,RENAME,或 ALTER 等 DDL 语句。如果当前事务中包含 DML 语句,那么 Oracle 首先提交(commit)此事务,然后将 DLL 语句作为一个只包含一条 SQL 语句的新事务运行并提交。
     3. 用户断开了与 Oracle 的连接。当前事务将被提交。
     4. 用户进程异常结束。则当前事务被回滚(roll back)。
     当一个事务(transaction)结束后,下一个可执行的 SQL 语句(executable SQL statement)将会自动地开始一个新事务。
     提示:应用程序在退出时应该显示地进行提交(commit)或回滚(roll back)操作。
4.2.1 事务提交
     提交(commit)一个事务(transaction)意味着将此事务中 SQL 语句对数据的修改永久地记录到数据库中。
     在一个修改了数据的事务(transaction)被提交之前,Oracle进行了以下操作:
     1. Oracle生成了撤销信息(undo information)。撤销信息包含了事务中各个 SQL 语句所修改的数据的原始值。
     2. Oracle在 SGA(系统内存区) 的重做日志缓冲区(redo log buffer)中生成了重做日志条目(redo log entry)。重做日志记录(redo log record)中包含了对数据块(data block)和回滚块(rollback block)所进行的修改操作。这些记录可能在事务提交之前被写入磁盘。
     3. 对数据的修改已经被写入 SGA 中的数据库缓冲区(database buffer)。这些修改可能在事务提交之前被写入磁盘。
     提示:已提交事务(committed transaction)中对数据的修改被存储在 SGA 的数据库缓冲区(database buffer)中,她们不一定立即被后台进程 DBWn 写入数据文件(datafile)内。Oracle将选择适当的时机进行写操作以保证系统的效率。因此写操作既可能发生在事务提交之前,也可能在提交之后。
     当事务(transaction)被提交之后,Oracle进行以下操作:
     1. 撤销表空间(undo tablespace)内部的事务表(transaction table)将记录此次提交(commit),Oracle为此事务分配一个唯一的系统变化编号(system change number,SCN),并将其记录在事务表中。
     2. 重做日志写进程(The log writer process,LGWR)将 SGA 内重做日志缓冲区(redo log buffer)中的重做日志条目(redo log entry)写入重做日志文件(redo log file)。同时还将此事务的 SCN 也写入重做日志文件。由以上两个操作构成的原子事件(atomic event)标志着一个事务成功地提交。
     3. Oracle释放加于表或数据行上的锁(lock)。
     4. Oracle将事务标记为完成。
     提示:在默认状态下,LGWR 将重做信息(redo log)写入联机重做日志文件(online redo log file)的工作应与事务(transaction commit)提交同步,重做信息写入磁盘后系统才能通知用户提交(commit)结束。但是为了缩短事务提交带来的延迟,应用开发者可以设定事务提交 与重做信息写入异步地执行,即事务提交无需等待重做信息被写入磁盘就可以结束。
4.2.2 事务回滚
     回滚(rolling back)的含义是撤销一个未提交事务(uncommitted transaction)中已执行的 SQL 语句对数据的修改。Oracle使用撤销表空间(undo tablespace)(或回滚段(rollback segment))来存储被修改的数据的原始值。而重做日志(redo log)内则保存了对数据修改操作的记录。
     用户可以回滚(roll back)整个未提交事务(uncommitted transaction)。除此之外,用户还可以部分回滚未提交事务,即从事务的最末端回滚到事务中任意一个被称为保存点(savepoint)的标记处。
     以下各种类型回滚操作(rollback)的过程基本相同:
     1. 语句级回滚(tatement-level rollback)(由于语句执行错误或死锁(deadlock)造成)
     2. 回滚到一个保存点(savepoint) 
     3. 依据用户请求回滚一个事务(transaction) 
     4. 由于进程异常终止而回滚一个事务 
     5. 由于实例(instance)异常终止而回滚所有正在执行的事务 
     6. 在数据库恢复(recovery)过程中回滚不完整的事务
     不考虑保存点(savepoint)而回滚(rolling back)整个事务(transaction)的过程如下:
     1. Oracle使用相关撤销表空间(undo tablespace)内的信息来撤销事务内所有 SQL 语句对数据的修改
     2. Oracle释放事务中使用的所有锁
     3. 事务结束
4.2.3 事务中的保存点
     用户在事务(transaction)内可以声明(declare)被称为保存点(savepoint)的标记。保存点将一个大事务划分为较小的片断。
     用户可以使用保存点(savepoint)在事务(transaction)内的任意位置作标记。之后用户在对事务进行回滚操作(rolling back)时,就可以选择从当前执行位置回滚到事务内的任意一个保存点。例如用户可以在一系列复杂的更新(update)操作之间插入保存点,如果执行过程中一个语句出现错误,用户 可以回滚到错误之前的某个保存点,而不必重新提交所有的语句。
     在开发应用程序时也同样可以使用保存点(savepoint)。如果一个过程(procedure)内包含多个函数(function),用户可以在每个函数的开始位置创建一个保存点。当一个函数失败时, 就很容易将数据恢复到函数执行之前的状态,回滚(roll back)后可以修改参数重新调用函数,或执行相关的错误处理。
     当事务(transaction)被回滚(rollback)到某个保存点(savepoint)后,Oracle将释放由被回滚语句使用的锁。其他等待被锁资源的事务就可以继续执行。需要更新(update)被锁数据行的事务也可以继续执行。
     将事务(transaction)回滚(roll back)到某个保存点(savepoint)的过程如下:
     1. Oracle 回滚指定保存点之后的语句。
     2. Oracle 保留指定的保存点,但其后创建的保存点都将被清除。
     3. Oracle 释放此保存点后获得的表级锁(table lock)与行级锁(row lock),但之前的数据锁依然保留。
     被部分回滚的事务(transaction)依然处于活动状态,可以继续执行。
     一个事务(transaction)在等待其他事务的过程中,进行回滚(roll back)到某个保存点(savepoint)的操作不会释放行级锁(row lock)。为了避免事务因为不能获得锁而被挂起,应在执行 UPDATE 或 DELETE 操作前使用 FOR UPDATE ... NOWAIT 语句。(以上内容讲述的是回滚保存点之前所获得的锁。而在保存点之后获得的行级锁是会被释放的,同时保存点之后执行的 SQL 语句也会被完全回滚)。
4.2.4 事务命名
     用户可以使用一个简单好记的字符串为事务(transaction)命名。事务的名称可以用于提示此事务的内容。在分布式事务(distributed transaction)中,事务命名(transaction name)已经替代了提交注释(commit comment),因为其具备以下优势:
     1. 使用事务命名有助于用户监控长时间运行的事务,以及处理不可信的分布式事务(in-doubt distributed transaction)。
     2. 用户可以在应用程序中浏览事务名及其ID。例如,DBA 可以在监控系统活动时使用企业管理器(Enterprise Manager)查看事务名称。
     3. 当兼容性参数(compatibility)被设置为 9i 或更高时,事务名可以被写入事务审计重做记录(transaction auditing redo record)中。
     4. LogMiner 可以通过事务名在重做日志(redo log)的事务审计记录(transaction auditing record)中查找特定的事务。
     5. 用户可以使用事务名在数据字典视图(data dictionary view)(例如 V$TRANSACTION)中查找特定的事务。
4.2.4.1 如何为事务命名
     用户可以在事务(transaction)开始前使用 SET TRANSACTION  NAME ... 语句为事务命名。
     当为事务(transaction)命名时,相当于将此名称与事务的 ID 绑定。因此事务名不需要唯一,同一时刻同一用户可以为不同的事务赋予相同的事务名,只要此名称对用户来说易于区分即可。
4.2.4.2 提交注释
     在之前版本 Oracle 的中,用户可以使用提交注释(commit comment)为事务(transaction)添加一个注释。但是这个注释只能在事务提交时添加。
     出于与之前版本兼容的考虑,Oracle 仍旧支持提交注释(commit comment)。但 Oracle 强烈建议用户使用事务命名(transaction name)。使用事务命名时,提交注释将被忽略。
     在以后的版本中,Oracle 将不再提供提交注释(commit comment)功能。
4.2.5 两步提交机制
     在分布式数据库(distributed database)中,Oracle 需要在网络环境下进行事务(transaction)控制,并保证数据一致性(data consistency)。而分布式环境中可能发生各种系统或网络故障。
     分布式事务(distributed transaction)指同一个事务(transaction)中的一个或多个 SQL 语句同时更新(update)分布式数据库(distributed database)中不同节点(node)的数据。
     两步提交机制(two-phase commit mechanism)可以保证所有参与分布式事务(distributed transaction)的数据库或者同时提交(commit),或者同时撤销(undo)事务中 SQL 语句的操作。两步提交机制还确保了由完整性约束(integrity constraint),远程过程调用(remote procedure call),及触发器(trigger)执行的隐式 DML 操作正常工作。
     Oracle 两步提交机制(two-phase commit mechanism)对于提交分布式事务(distributed transaction)的用户来说完全透明。用户甚至无需知道其事务是分布式的。当事务由一个 COMMIT 语句标志结束后会自动地触发两步式提交机制来提交此事务。数据库应用程序中无需使用任何代码或复杂的 SQL 语法就能处理分布式事务。
     后台进程(recoverer,RECO)能够自动地处理系统中出现的不可信的分布式事务(in-doubt distributed transaction)。不可信的分布式事务指因为各种系统或网络故障而阻碍了提交(commit)操作的分布式事务。当故障修复,通信恢复后,每个 Oracle 数据库本地的 RECO 进程将自动地提交(commit)或回滚(roll back)不可信的分布式事务,并保证所有参与分布式事务的节点协调一致。
     如果系统中的故障暂时无法恢复,Oracle允许数据库 DBA 在本地手工地提交(commit)或撤销(undo)此故障导致的不可信的分布式事务(in-doubt distributed transaction)。这个功能使本地的 DBA 可以释放被不可信的分布式事务锁住的资源。
     如果一个分布式环境中的数据库需要恢复(recovery),其他节点的 DBA 可以使用 Oracle 的恢复功能将他们各自管理的数据库也恢复到相同的时间点。这个功能保证了分布式环境中所有数据库的数据一致性(consistent)。
October 13

4.1 事务简介

     事务(transaction)是由一个或多个SQL语句组成的逻辑操作单位。事务具备原子性。一个事务内所有SQL语句对数据库产生的影响,要么被全部提交,作用到数据库,要么被全部回滚,将对数据库的修改撤销。
     一个事务开始于用户提交的第一条可执行的SQL语句,结束于之后进行的提交或回滚操作。使用COMMIT或ROLLBACK语句能够显示的结束一个事务,而提交一个DDL语句可以隐式的结束一个事务。
     以一个例子描述一个事务:假设一家银行客户需要将资金从储蓄帐户转移到支票帐户,处理此业务的事务应该由三个独立的操作构成:
     1. 从储蓄帐户中扣除资金
     2. 向支票帐户注入资金
     3. 在业务日志中记录此次业务
     oracle需要考虑两种情况。如果三条SQL语句全部正常执行,使帐户间的平衡得以保证,那么此事务中对数据的修改就可以应用到数据库中。但是,如果中途发生了错误,比如账号错误,硬件故障,资金不足导致事务中一条或两条SQL语句不能执行,那么整个事务必须被回滚,才能保证账户间的平衡。如图所示:

e.cncpt025


4.1.1 语句执行与事务控制
     一个成功执行的SQL语句与一个提交的事务是有区别的。一个SQL语句成功执行表明此语句:
     1. 解析正常
     2. 是有效的SQL语法结构
     3. 作为一个独立的语句运行无错误。
     但是在包含此语句的事务被提交之前,整个事务都可以被回滚,事务内所有语句对数据库的修改都可以被撤销。注意:尽管发生了回滚,事务内的SQL语句却是成功执行的。
     提交(commit)意味着用户显式或隐式的要求将事务中对数据的修改永久的记录到数据库中。当用户执行commit语句时即为显式的提交操作,当数据库应用程序正常结束或一个数据定义语句成功执行后将发生隐式的提交操作。
     事务被提交后,事务内SQL语句的对数据的修改将被永久的记录到数据库中,其他用户将能够看到这些改变。在事务提交后执行的查询就能看到变化后的数据了。
     用户可以在开始一个事务时使用set transaction ... name 语句为此事务命名。这有助于用户监控长时间运行的事务,以及处理不可信的分布式事务。
4.1.2 语句级回滚
     如果在一个SQL语句在执行过程中发生了错误,那么此语句对数据库产生的影响将被回滚,回滚后就如同此语句从未执行过。这种操作被称做语句级回滚(statement-level rollback)。
     在语句执行过程中发生的错误将会导致语句级回滚,例如向一个表中插入数据造成主键值重复即为此类错误。一个造成死锁的SQL语句解析的过程中发现错误,因为此语句还没有被执行,所以不会产生语句级回滚。
     一个SQL语句执行失败只会使此语句所做的数据修改失效。如果执行失败的是DDL语句,那么在此数据之前隐式执行的提交操作将不会被撤销。
     用户不能在回滚语句中直接引用隐式的保存点。
4.1.3 可恢复的空间分配问题
     当一个持续时间较长的数据库操作在执行过程中遭遇空间分配失败时,oracle可以将此操作暂时挂起,并在空间分配问题解决后恢复其执行。当发生空间分配问题时,oracle数据库服务器不会立即给执行此操作的用户返回错误提示,而是等待管理员解决此问题。当空间分配问题被纠正后,挂起的操作可以自动的恢复执行。
     注意:只有在客户端使用alter session语句显式的将会话设定为可恢复后,SQL语句才能运行在可恢复模式下。
     当满足以下条件之一时,运行与可恢复的空间分配模式下的语句将被挂起:
     1. 无可用空间
     2. 达到最大的数据扩展限制
     3. 超出空间配额限制
     在不可恢复的空间分配模式下,以上条件将导致运行错误,并使SQL语句回滚。语句被挂机将导致其所在事务同时被挂起。事务锁使用的所有资源在语句挂起期间都将被保留。 
     当产生错误的条件消除后,例如,管理员进行了处理,或其他查询使用的排序空间已释放,被挂起的语句将自动的恢复执行。

 
 
No list items have been added yet.