Meral
作者Meral·2013-07-08 15:38
数据库管理员·GUOJI

ORACLE和DB2的并发机制比较

字数 1209阅读 908评论 0赞 0
很多人都会问,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,都有自己的特色,只要合理地设计应用并配置好数据库参数,就能够满足绝大多数的需求。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广