SQL Server和Oracle并行处理方法对比

作者:ChinaITLab 时间:2009-01-20 15:48:00 

数据库并行访问,也就是两个或两以上用户同时访问同一数据,这也是数据库引擎如何设计和实现适度反应所面临的最大问题。设计优良、性能卓越的数据库引擎可以轻松地同时为成千上万的用户服务。而“底气不足”的数据库系统随着更多的用户同时访问系统将大大降低其性能。最糟糕的情况下甚至可能导致系统的崩溃。

当然,并行访问是任何数据库解决方案都最为重视的问题了,为了解决并行访问方面的问题各类数据库系统提出了各种各样的方案。 SQL Server和Oracle两大DBMS也分别采用了不同的并行处理方法。它们之间的实质差别在哪里呢?

并行访问的问题

并行访问出现问题存在若干种情况。在最简单的情形下,数量超过一个的用户可能同时查询同一数据。就这种情况而言数据库的操作目标很简单:尽可能地为用户们提供快速的数据访问。 这对我们现在常见的数据库来说不成问题:SQL Server和 Oracle 都采用了多线程机制,它们当然能够一次处理多个请求。

不过,在用户修改数据的情况下并行访问问题就变得复杂起来了。显然,数据库通常只允许唯一用户一次修改特定的数据。当某一用户开始修改某块数据时, SQL Server和 Oracle 都能很快地锁定数据,阻止其他用户对这块数据进行更新,直到修改该数据的第1位用户完成其操作并提交交易(commit transaction)。但是,当某一位用户正在修改某块数据时假设另一位用户又正想查询该数据的信息时会发生什么情况呢?在这种情况下数据库管理系统又该如何动作呢?Oracle 和 SQL Server针对这一问题采取了不同的解决方案。

SQL Server方法

现在不妨假设有人开始修改SQL Server上存储的数据,于是这块数据立即被数据库锁定。数据锁定操作阻塞其他任何访问该数据的连接——连查询操作都不会放过。于是,这块被锁定的数据只有在交易被提交或者回滚之后才能接受其他访问操作。

下面用SQL Server随带的pubs示例数据库做一个简单示范。在Query Analyzer内打开两个窗口。在第1个窗口中执行下列SQL操作语句,更新pubs数据库中某一图书的价格:

  use pubs
  go
  begin tran
  update titles
  set price = price * 1.05
  where
  title_id = 'BU2075'

由于代码中并没有执行commit语句,所以数据变动操作实际上还没有最终完成。接下来,在另一个窗口里执行下列语句查询titles数据表:

  select title_id,title,price
  from titles
  order by title_id.

你什么结果也得不到。窗口底部的小地球图标会转个不停。尽管我在先前的操作中仅仅更新了一行,但是,select语句的执行对象却恰好包含了其数据正被修改的一行。因此,上面的操作不会返回任何数据,除非回到第1个窗口提交交易或者回滚。

SQL Server的数据锁定方案可能会降低系统的性能和效率。数据被锁定的时间越长,或者锁定的数据量越大,其他数据访问用户就越可能不得不等待其查询语句的执行。因此,从程序员的角度来看,对SQL Server编程的时候应该尽量地把交易代码设计得既小又快。

标签:
0
投稿

猜你喜欢

  • python制作定时发送信息脚本的实现思路

    2023-01-17 15:24:11
  • Python爬虫框架之Scrapy中Spider的用法

    2023-10-04 10:38:21
  • 如何使用Python抓取网页tag操作

    2023-11-11 12:15:24
  • MySQL CHAR和VARCHAR存储、读取时的差别

    2024-01-22 20:54:58
  • 黑客谈 MSSQL SA权限入侵的感悟

    2008-03-20 10:18:00
  • Python数据分析之pandas比较操作

    2021-11-23 05:14:22
  • 仿淘宝网站的导航标签效果!

    2008-11-05 12:37:00
  • 2008北京奥运会倒计时js代码

    2008-01-22 18:18:00
  • IE7兼容模式与兼容视图

    2010-06-28 18:48:00
  • python简单实现插入排序实例代码

    2021-11-27 14:33:04
  • 给我一面国旗 python帮你实现

    2022-04-06 07:23:32
  • js关于 byval 与 byref 的区别

    2007-10-13 10:48:00
  • Goland激活码破解永久版及安装详细教程(亲测可以)

    2023-06-18 14:30:43
  • python 定义函数 返回值只取其中一个的实现

    2022-07-29 21:28:21
  • JavaScript的Number对象的toString()方法

    2024-04-18 10:08:55
  • python 时间处理之月份加减问题

    2023-11-08 01:05:42
  • Python pip替换为阿里源的方法步骤

    2023-07-19 15:39:23
  • python3 求约数的实例

    2023-12-29 03:18:59
  • 用CSS定义 li 样式

    2007-09-28 20:56:00
  • Vue登录拦截 登录后继续跳转指定页面的操作

    2024-05-28 15:48:14
  • asp之家 网络编程 m.aspxhome.com