您现在的位置: 无忧电子商务网 >> 信息学院 >> 程序开发 >> php >> 正文

SQL Server和Oracle防止数据锁定的比较

作者:佚名    信息学院来源:整理    点击数:    更新时间:2008-2-2 我要参与讨论

  sql server的人可能会说了,在查询中设置(nolock)不也能达到同样的效果吗?可是,对sql server而言,在数据映像之前是不能获取数据的。指定(nolock)实际上只是得到了没有提交的数据。oracle的方法则提供了数据的一致视图,所有的信息都是针对交易的、基于存储数据快照的。

如果在sqlplus的更新实例中提交更新交易在查询实例中就能看到薪水数据发生变化。如果在查询实例中重新运行先前的查询语句,那么oracle将返回新的薪水数值。

存储数据快照
说了半天,在给用户显示先前版本的数据同时,oracle是如何允许其他用户修改数据的呢?其实,只要某一用户启动了一宗修改数据的交易,之前的数据映像就会被写到一个特殊的存储区域。这种“前映像”用来向任何查询数据的用户提供一致的数据库视图。这样,当其他用户在修改数据的时候,在以上的测试中我们就能看到尚未发生变更的薪金数据。

这个特殊的存储区域在哪里呢?这个问题的答案就跟你正在使用的oracle版本有关了。在 oracle 8i及其以前版本中会为这一目的创建特殊的回滚段。然而,这种举措会给数据库管理员(dba)带来管理和调整数据段的工作负担。例如,dba必须确定为此需要的数据段的数量以及大小等。假如回滚段没有正确配置,那么对交易而言它们就可能不得不排队等待回滚段中出现必要的数据空间。

oracle 9i就不同了,这是oracle的最新版本,oracle实现了一种新特性,这就是所谓的undo表空间,它有效地消除了以上的管理复杂性。虽然回滚段仍然可以继续使用,但是,dba现在可以选择创建undo表空间的方式令oracle自己管理“前映像”的复杂空间分配。
oracle的这种方法对程序员具有重要意义。因为回滚空间不是无限的,所以,更新交易的数据快照会取代先前交易的映像。因此,如果必要的回滚段被其他交易的映像覆盖的话。运行时间较长的查询操作就可能产生“ snapshot too old”错误。

下面举个可能发生的案例。假设在上午11:59的时候某位职员开始更新john doe帐务的交易。这宗交易在下午12:01被提交。同时,下午12:00某财务经理开始查询所有的客户帐务报表和当月收费总计。因为客户很多,所以这一查询操作很费了点时间,但是不论这次操作到底执行了多久,反正它检索出的结果就是下午12:00数据库中存在的数据。如果包含john doe帐务前映像的回滚空间在查询执行到该客户名字的时候被覆盖则查询返回错误消息。
oracle的解决方案当然更为合理,在抽象意义上提供了相比sql server更佳的数据一致性。在执行oracle查询的时候无须担心较长的查询操作会锁定重要的交易。但是,在两种数据库同时支持海量用户的情况下也很难证明oracle是否就能真正实现具体条件下的数据一致性。

  

上一页  [1] [2] [3] 

在google里搜索更多SQL Server和Oracle防止数据锁定的比较

Google
Web www.51ec.org
  • 上一篇信息学院:

  • 下一篇信息学院:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    我来说两句 对此文章发表了评论
      昵 称: *必填    ·注册用户·
      评 分: 1分 2分 3分 4分 5分     严禁发表危害国家安全、政治、黄色淫秽等内容的评论,用户需对自己在使用本网站服务过程中的行为承担法律责任。本站管理员有权保留或删除评论内容,评论内容只代表机友个人观点,与本网站立场无关。  
    评 论
    内 容

     
    评论列表 (最新 评论仅限网友观点!)

    供求信息




    | 设为首页 | 加入收藏 | 关于我们 | 广告服务 | 联系方式 | 友情链接 | 版权申明