DB2和Oracle的区别.docx
- 文档编号:5280948
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:32
- 大小:80.87KB
DB2和Oracle的区别.docx
《DB2和Oracle的区别.docx》由会员分享,可在线阅读,更多相关《DB2和Oracle的区别.docx(32页珍藏版)》请在冰豆网上搜索。
DB2和Oracle的区别
DB2和Oracle的区别
DB2数据库的简介:
DB2是IBM公司的产品,起源于SystemR和SystemR*。
他支持从PC到UNIX,从中小型机到大型机;从IBM到非IBM(HP及SUNUNIX系统等)各种操作平台。
他既可以在主机上以主/从方式独立运行,也可以在客户/服务器环境中运行。
其中服务平台可以是OS/400,AIX,OS/2,HP-UNIX,SUN-Solaris等操作系统,客户机平台可以是OS/2或Windows,Dos,AIX,HP-UX,SUNSolaris等操作系统。
数据库服务器
DB2数据库核心又称作DB2公共服务器,采用多进程多线索体系结构,可以运行于多种操作系统之上,并分别根据相应平台环境作了调整和优化,以便能够达到较好的性能。
DB2核心数据库的特色
(1)支持面向对象的编程
DB2支持复杂的数据结构,如无结构文本对象,可以对无结构文本对象进行布尔匹配、最接近匹配和任意匹配等搜索。
可以建立用户数据类型和用户自定义函数。
(2)支持多媒体应用程序
DB2支持大二分对象(BLOB),允许在数据库中存取二进制大对象和文本大对象。
其中,二进制大对象可以用来存储多媒体对象。
(3)备份和恢复能力
(4)支持存储过程和触发器,用户可以在建表时显示的定义复杂的完整性规则
(5)支持的硅SQL查询
(6)支持异构分布式数据库访问
(7)支持数据复制
Oracle数据库的简介:
OracleDatabase,又名OracleRDBMS,或简称Oracle。
是甲骨文公司的一款关系数据库管理系统。
到目前仍在数据库市场上占有主要份额。
Oracle数据库是一种大型数据库系统,一般应用于商业,政府部门,它的功能很强大,能够处理大批量的数据,在网络方面也用的非常多。
不过,一般的中小型企业都比较喜欢用SQL数据库系统,它的操作很简单,功能也非常齐全。
只是比较oracle数据库而言,在处理大量数据方面有些不如。
Oracle数据库有如下几个强大的特性:
支持多用户、大事务量的事务处理
数据安全性和完整性的有效控制
支持分布式数据处理
可移植性很强
Oracle体系庞大,对于初学者来说,大体上要明白定位思想:
Oracle大体上分两大块,一块是应用开发,一块是系统管理。
Oracle数据库包括Oracle数据库服务器和客户端
Oracle数据库服务器:
OracleServer是一个对象一关系数据库管理系统。
它提供开放的、全面的、和集成的信息管理方法。
每个Server由一个OracleDB和一个OracleServer实例组成。
它具有场地自治性(SiteAutonomy)和提供数据存储透明机制,以此可实现数据存储透明性。
每个Oracle数据库对应唯一的一个实例名SID,Oracle数据库服务器启动后,一般至少有以下几个用户:
Internal,它不是一个真实的用户名,而是具有SYSDBA优先级的Sys用户的别名,它由DBA用户使用来完成数据库的管理任务,包括启动和关闭数据库;Sys,它是一个DBA用户名,具有最大的数据库操作权限;System,它也是一个DBA用户名,权限仅次于Sys用户。
客户端:
为数据库用户操作端,由应用、工具、SQL*NET组成,用户操作数据库时,必须连接到一服务器,该数据库称为本地数据库(LocalDB)。
在网络环境下其它服务器上的DB称为远程数据库(RemoteDB)。
用户要存取远程DB上的数据时,必须建立数据库链。
Oracle数据库的体系结构包括物理存储结构和逻辑存储结构。
由于它们是相分离的,所以在管理数据的物理存储结构时并不会影响对逻辑存储结构的存取。
基于以上的对DB2和Oracle的简介,要区别这两种数据库我们可以从以下几个方面来分析他们不同之处:
DB2和Oracle的并发控制(锁)方面比较:
在关系数据库(DB2,Oracle,Sybase,Informix和SQLServer)最小的恢复和交易单位为一个事务(Transactions),事务具有ACID(原子性,一致性,隔离性和永久性)特征。
关系数据库为了确保并发用户在存取同一数据库对象时的正确性(即无丢失更新、可重复读、不读"脏"数据,无"幻像"读),数据库中引入了并发(锁)机制。
基本的锁类型有两种:
排它锁(Exclusivelocks记为X锁)和共享锁(Sharelocks记为S锁)。
排它锁:
若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。
共享锁:
若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。
DB2多粒度封锁机制介绍
1锁的对象
DB2支持对表空间、表、行和索引加锁(大型机上的数据库还可以支持对数据页加锁)来保证数据库的并发完整性。
不过在考虑用户应用程序的并发性的问题上,通常并不检查用于表空间和索引的锁。
该类问题分析的焦点在于表锁和行锁。
2锁的策略
DB2可以只对表进行加锁,也可以对表和表中的行进行加锁。
如果只对表进行加锁,则表中所有的行都受到同等程度的影响。
如果加锁的范围针对于表及下属的行,则在对表加锁后,相应的数据行上还要加锁。
究竟应用程序是对表加行锁还是同时加表锁和行锁,是由应用程序执行的命令和系统的隔离级别确定。
DB2表锁的模式
DB2在表一级加锁可以使用以下加锁方式:
表一:
DB2数据库表锁的模式
下面对几种表锁的模式进一步加以阐述:
IS、IX、SIX方式用于表一级并需要行锁配合,他们可以阻止其他应用程序对该表加上排它锁。
∙如果一个应用程序获得某表的IS锁,该应用程序可获得某一行上的S锁,用于只读操作,同时其他应用程序也可以读取该行,或是对表中的其他行进行更改。
∙如果一个应用程序获得某表的IX锁,该应用程序可获得某一行上的X锁,用于更改操作,同时其他应用程序可以读取或更改表中的其他行。
∙如果一个应用程序获得某表的SIX锁,该应用程序可以获得某一行上的X锁,用于更改操作,同时其他应用程序只能对表中其他行进行只读操作。
S、U、X和Z方式用于表一级,但并不需要行锁配合,是比较严格的表加锁策略。
∙如果一个应用程序得到某表的S锁。
该应用程序可以读表中的任何数据。
同时它允许其他应用程序获得该表上的只读请求锁。
如果有应用程序需要更改读该表上的数据,必须等S锁被释放。
∙如果一个应用程序得到某表的U锁,该应用程序可以读表中的任何数据,并最终可以通过获得表上的X锁来得到对表中任何数据的修改权。
其他应用程序只能读取该表中的数据。
U锁与S锁的区别主要在于更改的意图上。
U锁的设计主要是为了避免两个应用程序在拥有S锁的情况下同时申请X锁而造成死锁的。
∙如果一个应用程序得到某表上的X锁,该应用程序可以读或修改表中的任何数据。
其他应用程序不能对该表进行读或者更改操作。
∙如果一个应用程序得到某表上的Z锁,该应用程序可以读或修改表中的任何数据。
其他应用程序,包括未提交读程序都不能对该表进行读或者更改操作。
IN锁用于表上以允许未提交读这一概念。
DB2行锁的模式
除了表锁之外,DB2还支持以下几种方式的行锁。
表二:
DB2数据库行锁的模式
DB2锁的兼容性
表三:
DB2数据库表锁的相容矩阵
表四:
DB2数据库行锁的相容矩阵
下表是笔者总结了DB2中各SQL语句产生表锁的情况(假设缺省的隔离级别为CS):
3DB2锁的升级
每个锁在内存中都需要一定的内存空间,为了减少锁需要的内存开销,DB2提供了锁升级的功能。
锁升级是通过对表加上非意图性的表锁,同时释放行锁来减少锁的数目,从而达到减少锁需要的内存开销的目的。
锁升级是由数据库管理器自动完成的,有两个数据库的配置参数直接影响锁升级的处理:
locklist--在一个数据库全局内存中用于锁存储的内存。
单位为页(4K)。
maxlocks--一个应用程序允许得到的锁占用的内存所占locklist大小的百分比。
锁升级会在这两种情况下被触发:
∙某个应用程序请求的锁所占用的内存空间超出了maxlocks与locklist的乘积大小。
这时,数据库管理器将试图通过为提出锁请求的应用程序申请表锁,并释放行锁来节省空间。
∙在一个数据库中已被加上的全部锁所占的内存空间超出了locklist定义的大小。
这时,数据库管理器也将试图通过为提出锁请求的应用程序申请表锁,并释放行锁来节省空间。
∙锁升级虽然会降低OLTP应用程序的并发性能,但是锁升级后会释放锁占有内存并增大可用的锁的内存空间。
锁升级是有可能会失败的,比如,现在一个应用程序已经在一个表上加有IX锁,表中的某些行上加有X锁,另一个应用程序又来请求表上的IS锁,以及很多行上的S锁,由于申请的锁数目过多引起锁的升级。
数据库管理器试图为该应用程序申请表上的S锁来减少所需要的锁的数目,但S锁与表上原有的IX锁冲突,锁升级不能成功。
如果锁升级失败,引起锁升级的应用程序将接到一个-912的SQLCODE。
在锁升级失败后,DBA应该考虑增加locklist的大小或者增大maxlocks的百分比。
同时对编程人员来说可以在程序里对发生锁升级后程序回滚后重新提交事务(例如:
ifsqlca.sqlcode=-912thenrollbackandretry等)。
Oracle多粒度锁机制介绍
根据保护对象的不同,Oracle数据库锁可以分为以下几大类:
(1)DMLlock(datalocks,数据锁):
用于保护数据的完整性;
(2)DDLlock(dictionarylocks,字典锁):
用于保护数据库对象的结构(例如表、视图、索引的结构定义);
(3)Internallocks和latches(内部锁与闩):
保护内部数据库结构;
(4)Distributedlocks(分布式锁):
用于OPS(并行服务器)中;
(5)PCMlocks(并行高速缓存管理锁):
用于OPS(并行服务器)中。
在Oracle中最主要的锁是DML(也可称为datalocks,数据锁)锁。
从封锁粒度(封锁对象的大小)的角度看,OracleDML锁共有两个层次,即行级锁和表级锁。
1Oracle的TX锁(行级锁、事务锁)
许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。
TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT…FORUPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。
所以,一个TX锁,可以对应多个被该事务锁定的数据行(在我们用的时候多是启动一个事务,然后SELECT…FORUPDATENOWAIT)。
在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。
Oracle不像DB2那样,建立一个链表来维护每一行被加锁的数据,这样就大大减小了行级锁的维护开销,也在很大程度上避免了类似DB2使用行级锁时经常发生的锁数量不够而进行锁升级的情况。
数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁。
2TM锁(表级锁)
意向锁的引出
表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表级锁相容;另一方面,还要检查该锁是否与表中的每一行上的锁相容。
比如一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也应被阻塞。
如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。
为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了"意向锁"的概念。
意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。
如:
对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。
这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高。
意向锁的类型
由两种基本的锁类型(S锁、X锁),可以自然地派生出两种意向锁:
意向共享锁(IntentShareLock,简称IS锁):
如果要对一个数据库对象加S锁,首先要对其上级结点加IS锁,表示它的后裔结点拟(意向)加S锁;
意向排它锁(IntentExclusiveLock,简称IX锁):
如果要对一个数据库对象加X锁,首先要对其上级结点加IX锁,表示它的后裔结点拟(意向)加X锁。
另外,基本的锁类型(S、X)与意向锁类型(IS、IX)之间还可以组合出新的锁类型,理论上可以组合出4种,即:
S+IS,S+IX,X+IS,X+IX,但稍加分析不难看出,实际上只有S+IX有新的意义,其它三种组合都没有使锁的强度得到提高(即:
S+IS=S,X+IS=X,X+IX=X,这里的"="指锁的强度相同)。
所谓锁的强度是指对其它锁的排斥程度。
这样我们又可以引入一种新的锁的类型:
共享意向排它锁(SharedIntentExclusiveLock,简称SIX锁):
如果对一个数据库对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。
例如:
事务对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加S锁),同时会更新个别行(所以要对该表加IX锁)。
这样数据库对象上所加的锁类型就可能有5种:
即S、X、IS、IX、SIX。
具有意向锁的多粒度封锁方法中任意事务T要对一个数据库对象加锁,必须先对它的上层结点加意向锁。
申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。
3Oracle的TM锁(表级锁)
Oracle的DML锁(数据锁)正是采用了上面提到的多粒度封锁方法,其行级锁虽然只有一种(即X锁),但其TM锁(表级锁)类型共有5种,分别称为共享锁(S锁)、排它锁(X锁)、行级共享锁(RS锁)、行级排它锁(RX锁)、共享行级排它锁(SRX锁),与上面提到的S、X、IS、IX、SIX相对应。
需要注意的是,由于Oracle在行级只提供X锁,所以与RS锁(通过SELECT…FORUPDATE语句获得)对应的行级锁也是X锁(但是该行数据实际上还没有被修改),这与理论上的IS锁是有区别的。
锁的兼容性是指当一个应用程序在表(行)上加上某种锁后,其他应用程序是否能够在表(行)上加上相应的锁,如果能够加上,说明这两种锁是兼容的,否则说明这两种锁不兼容,不能对同一数据对象并发存取。
下表为Oracle数据库TM锁的兼容矩阵(Y=Yes,表示兼容的请求;N=No,表示不兼容的请求;-表示没有加锁请求):
表五:
Oracle数据库TM锁的相容矩阵
一方面,当Oracle执行SELECT…FORUPDATE、INSERT、UPDATE、DELETE等DML语句时,系统自动在所要操作的表上申请表级RS锁(SELECT…FORUPDATE)或RX锁(INSERT、UPDATE、DELETE),当表级锁获得后,系统再自动申请TX锁,并将实际锁定的数据行的锁标志位置位(指向该TX锁);另一方面,程序或操作人员也可以通过LOCKTABLE语句来指定获得某种类型的TM锁。
下表是笔者总结了Oracle中各SQL语句产生TM锁的情况:
表六:
Oracle数据库TM锁小结
我们可以看到,通常的DML操作(SELECT…FORUPDATE、INSERT、UPDATE、DELETE),在表级获得的只是意向锁(RS或RX),其真正的封锁粒度还是在行级;另外,Oracle数据库的一个显著特点是,在缺省情况下,单纯地读数据(SELECT)并不加锁,Oracle通过回滚段(Rollbacksegment)来保证用户不读"脏"数据。
这些都提高了系统的并发程度。
由于意向锁及数据行上锁标志位的引入,减小了Oracle维护行级锁的开销,这些技术的应用使Oracle能够高效地处理高度并发的事务请求。
DB2多粒度封锁机制的监控
在DB2中对锁进行监控主要有两种方式,第一种方式是快照监控,第二种是事件监控方式。
1快照监控方式
当使用快照方式进行锁的监控前,必须把监控锁的开关打开,可以从实例级别和会话级别打开,具体命令如下:
db2updatedbmcfgusingdft_mon_lockon(实例级别)
db2updatemonitorswitchesusinglockon(会话级别,推荐使用)
当开关打开后,可以执行下列命令来进行锁的监控
db2getsnapshotforlocksonebankdb(可以得到当前数据库中具体锁的详细信息)
db2getsnapshotforlocksonebankdb
FriAug1515:
26:
00JiNan2004(红色为锁的关键信息)
DatabaseLockSnapshot
Databasename=DEV
Databasepath=/db2/DEV/db2dev/NODE0000/SQL00001/
Inputdatabasealias=DEV
Locksheld=49
Applicationscurrentlyconnected=38
Agentscurrentlywaitingonlocks=6
Snapshottimestamp=08-15-200315:
26:
00.951134
Applicationhandle=6
ApplicationID=*LOCAL.db2dev.030815021007
Sequencenumber=0001
Applicationname=disp+work
AuthorizationID=SAPR3
Applicationstatus=UOWWaiting
Statuschangetime=
Applicationcodepage=819
Locksheld=0
Totalwaittime(ms)=0
Applicationhandle=97
ApplicationID=*LOCAL.db2dev.030815060819
Sequencenumber=0001
Applicationname=tp
AuthorizationID=SAPR3
Applicationstatus=Lock-wait
Statuschangetime=08-15-200315:
08:
20.302352
Applicationcodepage=819
Locksheld=6
Totalwaittime(ms)=1060648
Subsectionwaitingforlock=0
IDofagentholdinglock=100
ApplicationIDholdinglock=*LOCAL.db2dev.030815061638
Nodelockwaitoccurredon=0
Lockobjecttype=Row
Lockmode=ExclusiveLock(X)
Lockmoderequested=ExclusiveLock(X)
Nameoftablespaceholdinglock=PSAPBTABD
Schemaoftableholdinglock=SAPR3
Nameoftableholdinglock=TPLOGNAMES
Lockwaitstarttimestamp=08-15-200315:
08:
20.302356
Lockisaresultofescalation=NO
ListOfLocks
LockObjectName=29204
Nodenumberlockisheldat=0
ObjectType=Table
TablespaceName=PSAPBTABD
TableSchema=SAPR3
TableName=TPLOGNAMES
Mode=IX
Status=Granted
LockEscalation=NO
db2getsnapshotfordatabaseondbname|grep-ilocks(UNIX,LINUX平台)
Locksheldcurrently=7
Lockwaits=75
Timedatabasewaitedonlocks(ms)=82302438
Locklistmemoryinuse(Bytes)=20016
Deadlocksdetected=0
Lockescalations=8
Exclusivelockescalations=8
Agentscurrentlywaitingonlocks=0
LockTimeouts=20
db2getsnapshotfordatabaseondbname|find/i"locks"(NT平台)
db2getsnapshotforlocksforapplicationsagentid45(注:
45为应用程序句柄)
Applicationhandle=45
ApplicationID=*LOCAL.db2dev.030815021827
Sequencenumber=0001
Applicationname=tp
AuthorizationID=SAPR3
Applicationstatus=UOWWaiting
Statuschangetime=
Applicationcodepage=819
Locksheld=7
Totalwaittime(ms)=0
ListOfLocks
LockObjectName=1130185838
Nodenumberlockisheldat=0
ObjectType=KeyValue
TablespaceName=PSAPBTABD
TableSchema=SAPR3
TableName=TPLOGNAMES
Mode=X
Status=Granted
LockEscalation=NO
LockObjectName=14053937
Nodenumberlockisheldat=0
ObjectType=Row
TablespaceName=P
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DB2 Oracle 区别