楼主: jiangzx

[精华] db2回滚处理问题

[复制链接]
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:332011新春纪念徽章
日期:2011-02-18 11:43:33
131#
发表于 2006-2-16 07:57 | 只看该作者
引用:
http://www-128.ibm.com/developer ... cles/dm-0512niuxzh/

总的来说,DB2的锁和Oracle的锁主要有以下大的区别:

1.Oracle通过具有意向锁的多粒度封锁机制进行并发控制,保证数据的一致性。DB2也是通过具有意向锁的多粒度封锁机制进行并发控制,保证数据的一致性。另外,在Oracle数据库中,单纯地读数据(SELECT)并不加锁,这些都提高了系统的并发程度,Oracle强调的是能够"读"到数据,并且能够快速的进行数据读取。而DB2的锁强调的是"读一致性",进行读数据(SELECT)时会根据不同的隔离级别(RR,RS,CS)而分别加S,IS,IS锁,只有在使用UR隔离级别时才不加锁。从而保证不同应用程序和用户读取的数据是一致的。最后一句话请大家注意!是不同应用程序和用户数据的读一致性。

2. 在支持高并发度的同时,DB2和Oracle对锁的操纵机制有所不同:Oracle利用意向锁及数据行上加锁标志位等设计技巧,减小了Oracle维护行级锁的开销,使其在数据库并发控制方面有着一定的优势。而DB2中对每个锁会在锁的内存(locklist)中申请分配一定字节的内存空间,具体是X锁64字节内存,S锁32字节内存(注:DB2 V8之前是X锁72字节内存而S锁36字节内存)。

3. Oracle数据库中不存在锁升级,而DB2数据库中当数据库表中行级锁的使用超过locklist*maxlocks会发生锁升级。

4. 在Oracle中当一个session对表进行insert,update,delete时候,另外一个session仍然可以从Orace回滚段或者还原表空间中读取该表的前映象(before image); 而在DB2中当一个session对表进行insert,update,delete时候,另外一个session仍然在读取该表数据时候会处于lock wait状态,除非使用UR隔离级别可以读取第一个session的未提交的值;所以Oracle同一时刻不同的session有读不一致的现象,而DB2在同一时刻所有的session都是"读一致"的。(cliser加:实际上其他的session读不出来,要等,Db2是读不出来不要紧,我要告诉你正在读的要改变,你要读,也是以前的数据,请等一等,你就会得到最新的数据,这对银行很重要,张三要出国,给他开存款证明,原来帐户有20万,在点比较寸的情况下,如果另一个应用转帐支取19万,Oracle就会马上告诉银行工作人员用户的存款是20万,可以开证明,但Db2就会等几秒,把最终的结果告诉银行工作人员,说存款是1万。Db2虽然慢。但是用了让人放心。对于“数据读一致性”,Oracle,Db2的解释是不同的,Oracle是保证同一session的读一致性,而同一时刻不同的session有读不一致的现象。而DB2在同一时刻所有的session都是"读一致"的。所以说Oracle和Db2对这个概念是各说各的。


如果不计较这个问题而且在有复杂查询的情况下,Oracle比Db2快,并发性要高。对于db2,sqlserver等数据库,在oltp上不适合在业务高峰期做复杂查询,对于只有简单查询,两者是半斤八两。

使用道具 举报

回复
论坛徽章:
0
132#
发表于 2006-2-17 22:45 | 只看该作者
Cliser强调DB2“不同应用程序和用户数据的读一致性。”好,让我们看看怎么回事。
“不同应用程序和用户”就是不同会话(Session),每个会话执行自己的事务(Transaction),Cliser是在说DB2保障不同会话、不同事务间的读一致性。请查阅数据库理论,哪个理论提到保障跨会话或跨事务读一致性?一个人修改数据,别人都甭想“读”,没有“读”,哪来“读”一致?等这个人提交了,别人都能读了,Oracle这时更能读呀,有什么区别?
我前面已经说了“一致性”的理论定义,Oracle判定是否读“一致性”是依据数据库理论,关系数据库理论可是IBM提出来的,大家标准一样,所以,Cliser“Oracle和Db2对这个概念是各说各的。”的观点是错的。
Cliser引述的《DB2 和 Oracle 的并发控制(锁)比较》中的“一致性” 曲解了数据库理论中的“一致性”。还好,IBM网页上说此文“并不代表 IBM 的官方观点”。

Oracle只有一种情况下出现同一时刻不同会话读的数据不一样,就是A用户改了数据但没有提交,A用户读到自己改的数据(看起来像废话),这时B用户可以读到A用户改动之前的数据。于是,读的数据不一样了,这没有违反读一致,也完全符合事务的四个要求ACID (Atomicity, Consistency, Isolation, Durability),还是绝大部分应用的需求呀。我存钱还没提交,当然可以让银行查余额;我在改一个图纸,当然可以让你看原始图纸。
cliser举了张三开存款证明的例子,转账的数据库事务(不是指银行业务流程)进行中,可能提交也可能取消,你说此时张三合法存款是多少?当然是20万。变成1万那是转账提交以后的事,也就是cliser说的“几秒”以后的事。要是转账取消了呢,一分钱没少,白等“几秒”。
别小看这“几秒”,您用繁忙的OLTP系统试试,在DB2中,您将看到时不时死锁和一些一眼望不到头的等待队列(夸张话 ),决不是Cliser 所说“两者是半斤八两。”
DB2如此表现是因为少一个功能,DB2没有回退段,拿不出一致数据(修改前的数据),别说银行数据,就是测试数据也读不出那20万来。而Oracle有此功能,游刃有余——按照客户需求进行“读”或“等”。
如果用户认为正在转账的数据的原始值可以被“读”,那Oracle就用“SELECT”语句,DB2能实现吗?如果用户认为此时该“等”,那就用“SELECT…FOR UPDATE”语句,和DB2效果一样。就这么简单,按用户业务需求来。

总之,按照理论来,不要偷换“一致性”概念,也不要把DB2缺点当优点。

-----------------------------
Cliser提到锁升级,偏离搂主的主题,我顺便说一句,“升级”通常指好事,但锁升级绝非好事。本来锁行,一下子升级为锁整个页、锁整个表,严重影响别人干活。

《DB2 和 Oracle 的并发控制(锁)比较》中,DB2篇幅是Oracle的两倍,可见DB2锁机制的复杂。Oracle锁全自动,读、写互不阻碍,无论高峰、低谷,OLTP、OLAP,简单查询、复杂查询,几乎不用人管,提高性能,又简化开发。

使用道具 举报

回复
招聘 : c/c++研发
论坛徽章:
45
技术图书徽章
日期:2014-03-10 14:09:192012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-01-04 11:51:22ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15现任管理团队成员
日期:2011-05-07 01:45:082011新春纪念徽章
日期:2011-01-25 15:42:562011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:41:50
133#
发表于 2006-2-18 05:21 | 只看该作者
"锁升级" 是为了内存,如果有程序对几乎所有行加锁又不commit,那么会很浪费内存的。如果不希望lock escalation得话可以直接increase locklist呀。
lock escalation确实让人郁闷,但是可以确保使用内存得限制。我不懂oracle是怎么控制锁的,所以对oracle没有评论^_^

使用道具 举报

回复
论坛徽章:
2
授权会员
日期:2005-10-30 17:05:332011新春纪念徽章
日期:2011-02-18 11:43:33
134#
发表于 2006-2-20 13:16 | 只看该作者
关系数据库的标准是IBM主导立的,Sybase,Mssql,Informix都能基本遵守,只有Oracle另成体系,在许多地方没有执行关系数据库的标准,对同一概念的解释是不同的。

Db2的默认级别是正在改变的数据的原始数据不可读!(读了也白读,不是最终结果。你看了错的图纸,还不如不看。心急吃不了热豆腐,Db2的价格要低于Oracle,这部分钱你可以买更好的硬件,弥补Db2在严格要求下的低并发性。)

Oracle的默认是正在修改的数据的原始数据可以读!只要有数据,我就能读,不管是不是可能改变。(对于oltp,绝大多数情况下是只要锁定,数据就是要改变的。)

不可否认,Oacle的回滚段能大幅提高并发性,但是它的前提是正在修改的数据的原始数据可以读。如果对于应用程序中的绝大部分select 都要求“SELECT…FOR UPDATE”,Oracle在并发性上就不如Db2了,因为Oracle此时仍然要将修改的数据写到回滚段中,多了个数据写的管理。



总之:
尺有所长,寸有所短。Oracle和Db2都在发挥长处,弥补缺点。



另:
Rank Company System tpmC Price/tpmC System Availability Database Operating System TP Monitor Date Submitted Cluster
1    IBM eServer p5 595 64p   3,210,540  5.07 US $  05/14/05  IBM DB2 UDB 8.2   IBM AIX 5L V5.3   Microsoft COM+   11/18/04  N  
2    IBM eServer p5 595 32p   1,601,784  5.05 US $  04/20/05  Oracle Database 10g Enterprise Edition   IBM AIX 5L V5.3   Microsoft COM+   04/20/05  N  
3    hp Integrity Superdome   1,231,433  4.82 US $  06/05/06  Microsoft SQL Server 2005 Enterprise Edt SP1   Microsoft Windows Server 2003 Datacenter Ed.(64-bit)SP1   Microsoft COM+   11/28/05  N  


http://www.tpc.org/tpcc/results/tpcc_perf_results.asp

使用道具 举报

回复
论坛徽章:
0
135#
发表于 2006-2-22 16:04 | 只看该作者
最初由 wangzhonnew 发布
[B]lock escalation确实让人郁闷,但是可以确保使用内存得限制。我不懂oracle是怎么控制锁的……[/B]

wangzhonnew 说到了Oracle不同于DB2、SQL Server、Sybase的另一特色——存于磁盘的锁。
锁和搂主的回滚段主题有些联系,由于回滚段的存在,Oracle比其他数据库锁的种类少,管理更简单。
和回滚段主题没有联系的是锁的存放地。Oracle是磁盘锁,存在数据块(DB2称为页)中,其他数据库是内存锁。磁盘锁数量近乎无限,可以实现无升级行级锁。行级锁粒度最小,所以阻塞和死锁概率最低。磁盘锁会增加少量存储空间(每GB数据大约需要5MB锁空间),增加少量I/O对性能的影响也比内存锁升级小的多。



最初由 cliser 发布
[B]Db2的最新版本对于这两个功能都可以实现,select ... for update 也是Oracle 9i以后的版本中才出来的功能。[/B]

cliser 同志,我不确定Oracle支持select ... for update 是哪一年,但当我学 Oracle 7 的时候就有了,十多年了。DB2实现了Oracle十多年前的功能。

OLTP特点就是用户多,非常看重并发性。OLTP事务执行快,不形象,所以我举内容管理(包括图纸管理、源代码管理、文档管理等)的例子,因为它和OLTP过程很像,节奏慢,容易理解。所有内容管理系统都是允许一个人修改一部分内容的时候,其他人可以只读这部分数据,以此来提高多人并行工作效率。效果如何您可以咨询设计人员、开发人员和文档管理员。OLTP系统压力越高,Oracle和DB2两种读写模式的优劣差别越明显。市场上大部分企业级系统都用Oracle,关键数据和非关键数据都没问题。

最初由 cliser 发布
Db2的价格要低于Oracle,这部分钱你可以买更好的硬件,弥补Db2在严格要求下的低并发性。

IBM工程师告诉我,这是IBM一贯策略,软件不足硬件补。

使用道具 举报

回复
论坛徽章:
0
136#
发表于 2006-2-22 20:40 | 只看该作者
上面贴子是我基于2月20日的帖子离线写的回复,刚才发现cliser已经对自己的帖子作了许多删改。
最初由 cliser 发布[B]
关系数据库的标准是IBM主导立的,Sybase,Mssql,Informix都能本遵守,只有Oracle另成体系,在许多地方没有执行关系数据库的标准,对同一概念的解释是不同的。
[/B]

主机DB2和DB2 UDB是完全两码事,你说哪个遵循国际标准?国际标准规定了实现什么功能,而没说要做成什么“体系”,从没有哪个标准说不能有回退段,也没有哪个标准说必须内存锁。Oracle支持ANSI SQL99,这点最重要的。
“一致性”概念,我引述第三方组织的:
http://en.wikipedia.org/wiki/ACID
In databases, ACID stands for Atomicity, Consistency, Isolation, and Durability...
Atomicity ...
Consistency refers to the database being in a legal state when the transaction begins and when it ends. This means that a transaction can't break the rules, or integrity constraints, of the database. If an integrity constraint states that all accounts must have a positive balance, then any transaction violating this rule will be aborted.
Isolation ...
Durability ...
The ACID concept is described in ISO/IEC 10026-1:1992 Section 4.
上述可见,Oracle的对一致性的解释完全符合国际标准的概念。


最初由 cliser 发布[B]
1    IBM eServer p5 595 64p   3,210,540  5.07 US $  05/14/05  IBM DB2 UDB 8.2   IBM AIX 5L V5.3   Microsoft COM+   11/18/04  N  
2    IBM eServer p5 595 32p   1,601,784  5.05 US $  04/20/05  Oracle Database 10g Enterprise Edition   IBM AIX 5L V5.3   Microsoft COM+   04/20/05  N  
[/B]

注意,DB2的硬件是"64p",Oracle的是"32p",硬件不同不具有可比性,并且这和回退段主题没有直接关系。

我在ITPub的开张帖都用在论述回退段和读一致性上了,够详了,就到这吧。

使用道具 举报

回复
论坛徽章:
0
137#
发表于 2006-2-28 09:05 | 只看该作者
最初由 cliser 发布
[B]如何理解“数据一致性”?
    关键是数据库是否满足需求自己的需求!
    oracle的高并发性使以牺牲数据准确性为代价的,当查询要求的准确性不高的情况下是可以的。想想看,大家在9:00发起查询,你说你要的是9:00查询结果,还是想要9:03的结果,我想大多数人会要9:03的结果,Oracle查询的数据是不能反映当前真实情况的,当然这种情况对于实际来说,比较少见,对于一般的系统可以接受的。但Oracle的“数据一致性”对于严格要求是无法满足的。DB2,SYBASE,SQL SERVER的默认隔离级别要高于Oracle的默认级别,所以并发性要低于Oracle。
    “而Oracle通过回退段巧妙的解决了这个问题”,你如果仅仅是看查询开始的时间点的数据值,Oracle确实“巧妙”的解决了问题!但是如果我要的是查询结束后的结果,Oracle没有解决这个问题!关键是你的用户是否接受Oracle的查询出的结果可能不是最后的结果这一“瑕疵”,那么,Oracle比Db2,Sybase等的并发性要高!如果你的客户眼里容不得“沙子”,Oracle的并发性就和Db2等一样了。

    “举个例子,你复制一个大文件,别人同时改这个文件,你希望自己复制的是9:00的前后一致的文件,还是有9:00、9:01和9:03混合内容的文件?文件前后不一致都可能打不开。放到数据库上,如果Select出来的数据前后不一致,数据可能无法使用。以你的这个50000条记录的表为例说明,假设Select和其他会话没有隔离开,执行一个自连接查询(一条记录的外键是另一条记录的主键),开头明明看到有条记录指向张三的1000元,过去一看变800了,这不就违反数据一致性了嘛。这是自连接的例子,外连接您可以自己设想一下。”
     对于这个问题,DB2,SQLSERVER如果对这些5000条记录的查询用了“自连接”或“外连接”,会对这5000条记录加锁,禁止修改,保证查询的一致性,也就是并发性要降低,但是你看到的是最终结果,而不是发起查询时的结果。
       不管怎么说,如果用同一把尺子,同样的数据准确性上,oracle和db2等的并发性是一样的。这把尺子是客户的,不是你Oracle的,也不是Db2的。 [/B]


你这个问题其实有些混淆视听。

请问,你在银行进行异地存取业务,是否银行会告诉你在最短半天内才会在异地查询正确结果,不会有任何银行告诉你,你可以马上查询到结果。

另外,如果我在异地进行存取款业务,如果我本来想存1000元,那么最后有可能我又不想存那么多了,我需要撤销。这个时候,按照你的理论,是否又会有冲突?

所以,不同的应用会有不同的解决方案。请注意,我这里说的是应用,而不是单个的数据库产品。这个应用包括中间件产品,包括SI做的一些应用客户端。你不可能要求一种解决方案应对所有的实际生产情况。这也是开发人员和DBA的重要性所在。

其实说道选用何种数据库,我觉得和技术细节关系不大。主要看用户的最终需求。其实用户不会管你是否锁表,他关心的内容最简单:
1、是否可以满足7X24的运行
2、是否降低升级时的成本

从这两点来说,我认为Oracle的cluster技术还是要优于DB2的cluster技术的。

最后,我想说一句,任何一个企业的决策者,在考虑数据库产品时,一定要考虑整个IT业的技术环境。相对来说,oracle的技术环境是优于DB2的。这点我想没有人反对

使用道具 举报

回复
论坛徽章:
0
138#
发表于 2006-3-16 11:25 | 只看该作者

顶起来!!!

大家对这个话题可以讨论的更深入一点:
谈到DB2的回滚,大家应该讨论 ARIES,印度大师给DB2写的.

关键问题是:ORALCE并发控制用时间戳来实现的;DB2用锁机智实现的.
另外ORACLE 8 才开始提供位图管理的表空间,这种好技术到今天8.0才引入,何谈高技术?,国人当自强啊,因为我们没有.

能不能讨论一下死锁检测的回路测试算法呢? 如果形成回路,就预测到了死锁.

呵呵
是需要秘笈还是宝刀呢?
挑战自己吧!

使用道具 举报

回复
论坛徽章:
1
2010新春纪念徽章
日期:2010-01-04 08:33:08
139#
发表于 2006-3-25 09:06 | 只看该作者

Re: 看来版主果然有一定过人之处

update/delete/insert和select的冲突问题,是绝对的,任何一个DBMS都无法避免。Oracle和DB2在这里采用了完全不同的策略。仔细想想,Oracle的update/delete/insert和select的协调有什么代价没有?拿到的是真实的时点值么?
通过调整各个环境参数,DB2要做到同样的事情是没有问题的。问题是你怎么看这个问题。
关系数据库本身的性质决定对这个问题没有十全十美的解决方案。
目前最新的TPCC测试(国内,某电信,厂商直接参与),DB2对Oracle已经取得了较大的优势,当然这和具体参与的人的素质是有关系的。TPCH一般没什么争议。
习惯的力量是很大的,大家在学校里面辉Oracle的人比DB2要多多了,这和IBM内部那些制定规则的但又不了解国情的老大...绝对有关系。现在国内太多的DB2项目都是从Oracle移植过来的,而且时间和经验方面的关系,性能问题是普遍的。

使用道具 举报

回复
论坛徽章:
1
2010新春纪念徽章
日期:2010-01-04 08:33:08
140#
发表于 2006-3-25 09:16 | 只看该作者

IBM工程师告诉我,这是IBM一贯策略,软件不足硬件补。 [/B]


6000的人说的?还是DB2的人说的?if是DB2的,告诉我是谁,呵呵

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表