强力PK — DB2和Oracle并发机制比较

很多人都会问,DB2和Oracle在并发机制上到底有什么根本性的区别?总结起来,它们之间的区别主要体现在以下几个方面:
1.DB2在做数据修改时,在日志中既记录了修改前数据(也就是UNDO日志),也记录了修改后的数据(即REDO日志)。而Oracle只在日志中记录修改后数据,而将修改前的数据记录到"回滚段"(ROLLBACK SEGMENT)中。
2.在Oracle中,当一个应用程序对表以Insert、Update和Delete操作进行修改时,另外一个应用程序在读取该表时,会从回滚段中读取该表修改前的数据。而对于DB2 V9.7之前的版本,读取数据的应用程序,遇到正在被其他应用程序修改的数据时,将会进行锁等待(除非使用UR隔离级别)。对于DB2 V9.7及以后版本,由于引入了当前已落实,读取数据的应用程序将不需要等待锁释放,而是会从日志中读取数据修改前的版本(即已落实的版本,相当于Oracle回滚段中的数据)。
3.Oracle利用数据行上的标志位来实现锁机制,而DB2是通过把锁信息记录在锁列表(LOCKLIST)中来实现的。当请求加锁时,DB2会检查锁列表,看数据对象上是否已加锁,以及请求的锁与已加的锁是否兼容。
4.Oracle数据库中,对数据的读操作是不加锁的。而DB2强调"读一致性",在读数据行时,会根据隔离级别的不同而加S或IS锁,只有在使用UR隔离级别时才不加S或IS锁,这保证了不同应用程序和用户读取的数据是一致的。默认情况下,Oracle同一时刻不同的应用程序有读不一致的现象,而DB2在同一时刻所有的应用程序读到的数据都是一致的。
5.Oracle数据库中不存在锁升级,而DB2数据库中当锁列表(LOCKLIST)被耗尽,或者单个事务锁占用的内存空间超过LOCKLIST×(MAXLOCKS/100)个页时会发生锁升级。
6.DB2缺省的隔离级是CS,对于大多数应用来说,缺省的CS级别可以满足需要。而Oracle缺省的隔离级别类似DB2的UR,读取数据和更新不会互锁(如果提高Oracle的隔离级别,也会产生互锁问题),但只能读到已提交的数据,无法得到最近修改(但暂时未提交)的版本。
7.DB2在UR隔离级别下,遇到正在被更改的数据会读最新的没有提交的脏数据;而Oracle在其所有的隔离级别(即read committed、serializable以及read-only隔离级别)下都不会读取脏数据(在read committed级别下,会从回滚段中直接读取修改前的曾经提交过的数据)。在一些应用里,需要读到最新的数据,也就是脏数据。对这两种方法严格来说并没有谁好谁坏,ANSI标准也并没有明确规定。
总结一下,对于并发控制,无论是DB2还是Oracle,都有自己的特色,只要合理地设计应用并配置好数据库参数,就能够满足绝大多数的需求。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25714482/viewspace-720323/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25714482/viewspace-720323/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值