SQLServer和Oracle数据锁定比较
数据库并行访问,也就是两个或两以上用户同时访问同一数据,这也是数据库引擎如何设计和实现适度反应所面临的最大问题。it.Phontol.com设计优良、性能卓越的数据库引擎可以轻松地同时为成千上万的用户服务。it.Phontol.com而“底气不足”的数据库系统随着更多的用户同时访问系统将大大降低其性能。it.Phontol.com最糟糕的情况下甚至可能导致系统的崩溃。it.Phontol.com 当然,并行访问是任何数据库解决方案都最为重视的问题了,为了解决并行访问方面的问题各类数据库系统提出了各种各样的方案。it.Phontol.com SQL Server和Oracle两大DBMS也分别采用了不同的并行处理方法。it.Phontol.com它们之间的实质差别在哪里呢? 并行访问的问题 并行访问出现问题存在若干种情况。it.Phontol.com在最简单的情形下,数量超过一个的用户可能同时查询同一数据。it.Phontol.com就这种情况而言数据库的操作目标很简单:尽可能地为用户们提供快速的数据访问。it.Phontol.com 这对我们现在常见的数据库来说不成问题:SQL Server和 Oracle 都采用了多线程机制,它们当然能够一次处理多个请求。it.Phontol.com 不过,在用户修改数据的情况下并行访问问题就变得复杂起来了。it.Phontol.com显然,数据库通常只答应唯一用户一次修改特定的数据。it.Phontol.com当某一用户开始修改某块数据时, SQL Server和 Oracle 都能很快地锁定数据,阻止其他用户对这块数据进行更新,直到修改该数据的第1位用户完成其操作并提交交易(commit transaction)。it.Phontol.com但是,当某一位用户正在修改某块数据时假设另一位用户又正想查询该数据的信息时会发生什么情况呢?在这种情况下数据库治理系统又该如何动作呢?Oracle 和 SQL Server针对这一问题采取了不同的解决方案。it.Phontol.com SQL Server方法 现在不妨假设有人开始修改SQL Server上存储的数据,于是这块数据立即被数据库锁定。it.Phontol.com数据锁定操作阻塞其他任何访问该数据的连接——连查询操作都不会放过。it.Phontol.com于是,这块被锁定的数据只有在交易被提交或者回滚之后才能接受其他访问操作。it.Phontol.com 下面用SQL Server随带的pubs示例数据库做一个简单示范。it.Phontol.com在Query Analyzer内打开两个窗口。it.Phontol.com在第1个窗口中执行下列SQL操作语句,更新pubs数据库中某一图书的价格:
代码执行后回复消息称两行数据已被更新。it.Phontol.com 注重,以上代码中并每有像在SQL Server示例那样键入“begin tran”字样的代码。it.Phontol.comOracle 的SQLPlus隐含启用交易(你还可以模拟SQL Server的行为,设置“autocommit to on”自动地提交交易)。it.Phontol.com接下来我们在SQLPlus更新实例中再执行同查询实例一样的select语句。it.Phontol.com 结果清楚地表明:Michael和Pat的薪水都增加了,然而这个时候我还没有提交数据变更交易。it.Phontol.comOracle不需要用户等待数据更新实例中操作被提交,它径直返回Michael和Pat的查询信息,但实际上返回的是数据更新开始之前的数据视图! 这时候,熟悉SQL Server的人可能会说了,在查询中设置(NOLOCK)不也能达到同样的效果吗?可是,对SQL Server而言,在数据映像之前是不能获取数据的。it.Phontol.com指定(NOLOCK)实际上只是得到了没有提交的数据。it.Phontol.comOracle的方法则提供了数据的一致视图,所有的信息都是针对交易的、基于存储数据快照的。it.Phontol.com 假如在SQLPlus的更新实例中提交更新交易在查询实例中就能看到薪水数据发生变化。it.Phontol.com假如在查询实例中重新运行先前的查询语句,那么Oracle将返回新的薪水数值。it.Phontol.com 存储数据快照 说了半天,在给用户显示先前版本的数据同时,Oracle是如何答应其他用户修改数据的呢?其实,只要某一用户启动了一宗修改数据的交易,之前的数据映像就会被写到一个非凡的存储区域。it.Phontol.com这种“前映像”用来向任何查询数据的用户提供一致的数据库视图。it.Phontol.com这样,当其他用户在修改数据的时候,在以上的测试中我们就能看到尚未发生变更的薪金数据。it.Phontol.com 这个非凡的存储区域在哪里呢?这个问题的答案就跟你正在使用的Oracle版本有关了。it.Phontol.com在 Oracle 8i及其以前版本中会为这一目的创建非凡的回滚段。it.Phontol.com然而,这种举措会给数据库治理员(DBA)带来治理和调整数据段的工作负担。it.Phontol.com例如,DBA必须确定为此需要的数据段的数量以及大小等。it.Phontol.com假如回滚段没有正确配置,那么对交易而言它们就可能不得不排队等待回滚段中出现必要的数据空间。it.Phontol.com Oracle 9i就不同了,这是Oracle的最新版本,Oracle实现了一种新特性,这就是所谓的undo表空间,它有效地消除了以上的治理复杂性。it.Phontol.com虽然回滚段仍然可以继续使用,但是,DBA现在可以选择创建undo表空间的方式令Oracle自己治理“前映像”的复杂空间分配。it.Phontol.com Oracle的这种方法对程序员具有重要意义。it.Phontol.com因为回滚空间不是无限的,所以,更新交易的数据快照会取代先前交易的映像。it.Phontol.com因此,假如必要的回滚段被其他交易的映像覆盖的话。it.Phontol.com运行时间较长的查询操作就可能产生“ snapshot too old”错误。it.Phontol.com 下面举个可能发生的案例。it.Phontol.com假设在上午11:59的时候某位职员开始更新John Doe帐务的交易。it.Phontol.com这宗交易在下午12:01被提交。it.Phontol.com同时,下午12:00某财务经理开始查询所有的客户帐务报表和当月收费总计。it.Phontol.com因为客户很多,所以这一查询操作很费了点时间,但是不论这次操作到底执行了多久,反正它检索出的结果就是下午12:00数据库中存在的数据。it.Phontol.com假如包含John Doe帐务前映像的回滚空间在查询执行到该客户名字的时候被覆盖则查询返回错误消息。it.Phontol.com Oracle的解决方案当然更为合理,在抽象意义上提供了相比SQL Server更佳的数据一致性。it.Phontol.com在执行Oracle查询的时候无须担心较长的查询操作会锁定重要的交易。it.Phontol.com但是,在两种数据库同时支持海量用户的情况下也很难证实Oracle是否就能真正实现具体条件下的数据一致性。 来源:收集整理于互联网 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |