SQL Server与Oracle并行访问的区别

设计优良、性能卓越的数据库引擎可以轻松地同时为成千上万的用户服务。而“底气不足”的数据库系统随着更多的用户同时访问系统将大大降低其性能。最糟糕的情况下甚至可能导致系统的崩溃。 中国.站.长站

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

并行访问的问题

 

 

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

 

 

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

 

 

SQL Server方法

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

下面用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编程的时候应该尽量地把交易代码设计得既小又快。

在SQL Server的最近版本中,微软对SQL Server进行了某些修改,使其一次锁定的数据量大大减少,这是数据库设计中的一大重要改进。在6.5版及以前版本中,最少的数据锁定量是一页。哪怕你只在修改一行数据,而该行数据位于包含10行数据的一页上,则整页10行数据都会被锁定。显然,这么大的数据锁定量增加了其他数据访问连接不得不等待数据修正完成的概率。在SQL Server 7中,微软引入了行锁定技术,这样,目前的SQL Server只锁定实际正被改变的数据行。

 

 

SQL Server的解决方案听起来很简单,但实际上其幕后为提供足够的系统高性能而采取了很多措施。例如,如果你在同时修改多行数据,SQL Server则会把数据锁定范围提升到页级别乃至锁定整个数据表,从而不必针对每一记录跟踪和维护各自的数据锁。 中.国.站长站

Oracle方法

下面我们再看看Oracle数据库是如何实施类似操作的。首先,我打开一个SQLPlus实例执行下列查询语句(这个例子可以在Oracle 9i中示例中找到)。这个实例称做查询实例:

以下为引用的内容:
select first_name, last_name, salary
from hr.employees where department_id = 20; 中国站长_站,为中文网站提供动力

代码返回两行数据,然后,再打开另一个SQLPlus实例——更新实例来执行以下命令:

STORYD STORYD

帮你写出让领导满意的精美文稿

STORYD 137 查看详情 STORYD

以下为引用的内容:
SQL> update hr.employees 2 set salary = salary * 1.05 3
where 4 department_id = 20 5 /

 

 

代码执行后回复消息称两行数据已被更新。 Chinaz.com

注意,以上代码中并没有像在SQL Server示例那样键入“begin tran”字样的代码。Oracle的SQLPlus隐含启用交易(你还可以模仿SQL Server的行为,设置“autocommit to on”自动地提交交易)。接下来我们在SQLPlus更新实例中再执行同查询实例一样的select语句。

结果清楚地表明:Michael和Pat的薪水都增加了,然而这个时候我还没有提交数据变更交易。Oracle不需要用户等待数据更新实例中操作被提交,它径直返回Michael和Pat的查询信息,但实际上返回的是数据更新开始之前的数据视图!

 

 

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

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

 

 

存储数据快照

 

 

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

 

 

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

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是否就能真正实现具体条件下的数据一致性。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/830834.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Linux strings能处理哪些类型文件
上一篇 2025年11月27日 07:57:16
离谱!美国教授用ChatGPT「证实」论文抄袭,半个班学生惨遭挂科
下一篇 2025年11月27日 07:57:20

相关推荐

  • 在Linux中如何通过命令行安装Java JDK

    在Linux中安装Java JDK可通过包管理器或手动安装,推荐使用系统自带工具安装OpenJDK。对于Ubuntu/Debian系统,先更新软件包列表:sudo apt update,再搜索可用版本:apt search openjdk-*,然后安装指定版本如OpenJDK 17:sudo apt…

    2026年9月20日
    000
  • 如何配置Scala与Java混合开发环境 Scala环境与JDK整合方法

    配置Scala与Java混合开发环境的关键是安装JDK、Scala并统一管理依赖。1. 安装JDK 8或11,配置JAVA_HOME和PATH;2. 安装Scala并设置SCALA_HOME;3. 使用SBT创建项目,配置build.sbt,组织src目录;4. 在IntelliJ IDEA中安装S…

    2026年9月20日
    100
  • 如何在Laravel中实现数据加密

    在laravel中实现数据加密的最直接且推荐方式是使用内置的crypt门面,其基于openssl并默认采用aes-256算法,通过app_key进行加解密。1. 使用crypt::encryptstring()或crypt::encrypt()对字符串或数组/对象进行加密;2. 使用crypt::d…

    2026年9月13日
    100
  • 如何在mysql中迁移分区表数据

    答案:MySQL分区表数据迁移需确保结构兼容性和数据完整性,常用方法包括:1. 使用INSERT INTO…SELECT迁移数据,要求目标表已存在且WHERE条件匹配分区范围;2. 通过mysqldump导出导入,适用于跨实例迁移,操作简单但大表性能差;3. 模拟EXCHANGE PAR…

    2026年9月10日
    100
  • thinkphp8相比thinkphp6有哪些新特性

    ThinkPHP8在性能、架构、功能和开发体验上全面升级,采用全新模块化架构,优化路由解析与数据库查询,提升响应速度;支持PHP 8.0+新特性,代码更简洁高效;增强中间件、路由、模型及验证功能,强化安全防护;兼容TP6代码,无缝升级,降低迁移成本。 ThinkPHP8 相比 ThinkPHP6 进…

    2026年9月10日
    400
  • Oracle DATE类型的时间组件处理与日期存储策略

    Oracle数据库的`DATE`数据类型始终包含日期和时间组件,即使未明确指定时间,系统也会默认填充午夜(00:00:00)。因此,当期望只存储日期时,实际存储的仍会包含时间部分。本文将深入探讨这一特性,并提供在SQL查询和应用程序层面有效管理和显示日期(不含时间)的策略,强调应通过格式化而非尝试修…

    2026年9月9日
    200
  • mysql中如何审计用户操作

    答案:MySQL审计可通过企业版插件、通用日志、触发器或外部工具实现。使用MySQL Enterprise Audit插件可详细记录登录与操作行为;社区版可启用general_log记录所有SQL语句,但影响性能;关键表可创建审计表和触发器追踪DML变更;还可结合Percona、ProxySQL或E…

    2026年9月9日
    100
  • 如何在安装完成后配置表空间管理

    首先创建表空间并指定存储路径与大小,Oracle和PostgreSQL通过CREATE TABLESPACE命令实现;接着可为用户设置默认表空间,避免每次建表显式指定;然后在建表时可通过TABLESPACE子句指定对象存储位置;定期使用系统视图或函数监控表空间使用情况,防止空间不足;当空间紧张时,可…

    2026年9月9日
    000
  • 什么是mysql数据库及其基本概念

    MySQL是开源关系型数据库,基于SQL操作,用于Web开发;包含数据库、表、行、列等基本概念,支持主键唯一标识和外键关联表,常用SQL语句包括SELECT、INSERT、UPDATE、DELETE,广泛应用于电商、博客等需数据持久化与一致性的场景。 MySQL 是一种广泛使用的关系型数据库管理系统…

    2026年9月8日
    100
  • OpenJPA与Oracle:解决4000字节字符串限制警告

    当openjpa在oracle数据库环境中记录“warn: … is being mapped with a handler that may not be able to store values over 4000 bytes/chars long”警告时,这通常意味着实体中某个字符…

    2026年9月8日
    000
  • 数据量大的App制作,数据库如何选型?

    在开发处理大量数据的应用程序时,数据库的选择至关重要。选择一个合适的数据库不仅能确保数据的存储效率和安全性,还能提升应用程序的整体性能和用户体验。以下将从几个关键方面探讨如何为数据量大的app选择合适的数据库。 首先,考虑数据量的大小。 对于数据量庞大的应用程序,首要考虑的是数据库的存储能力和扩展性…

    2026年9月7日
    000
  • 最小化Java中的可变范围:安全有效代码的最佳实践

    本文探讨了缩小Java变量作用域以提升代码可读性、可维护性和安全性至关重要的问题。文章将Java的面向对象方法与C等语言进行了对比,并通过方法封装和受控访问等最佳实践示例,阐述了如何有效地限制变量的作用域。 在Java中,变量的作用域是指程序中可以访问该变量的区域(Mahrsee, 2024)。作用…

    2026年9月7日
    000
  • 解决SQL Server 2016 JRE7更新问题

    解决SQL Server 2016 JRE7更新问题解决SQL Server 2016 JRE7更新问题解决SQL Server 2016 JRE7更新问题解决SQL Server 2016 JRE7更新问题

    安装sql server 2016时,若系统中缺少必要的运行组件,可能会导致安装过程被中断。其中,未安装合适的java运行环境是较为常见的原因之一。为避免此类问题,应在安装前部署与sql server兼容的jre版本,并正确设置相关环境变量。完成配置后,重新启动sql server安装程序即可继续安…

    2026年9月7日 用户投稿
    000
  • sql语言中,删除一个表的命令是什么?

    sql语言中,删除一个表的命令是“DROP”,具体语法格式“DROP TABLE [IF EXISTS] 表名”。“DROP TABLE”命令可以同时删除多个表,只要将表名依次写在后面,相互之间用逗号隔开即可。 (推荐教程:mysql视频教程) SQL语言中,删除一个表的命令是( )。 A.DELE…

    2026年9月7日
    100
  • Java开发入门必学技能清单

    Java开发入门必学技能清单Java开发入门必学技能清单Java开发入门必学技能清单Java开发入门必学技能清单

    java开发一般指的是javaee方向的开发,从事这一领域需要掌握一系列核心技术,如servlet、jsp、spring框架、hibernate、数据库操作以及web服务等相关知识。 1、 打好JavaSE基础是学习Java开发的前提,无论后续是走JavaEE路线还是转向安卓开发,这都是必不可少的一…

    2026年9月7日 用户投稿
    100
  • 什么是爪哇?为什么在后端开发中受欢迎?

    Java凭借其跨平台兼容性、处理大型应用的能力以及可靠性,成为后端开发领域举足轻重的编程语言。自1995年由Sun Microsystems发布以来,Java已广泛应用于各种后端系统。 其在后端开发中的流行,源于以下几个关键优势: 跨平台运行: Java遵循“一次编写,随处运行”(WORA)原则。借…

    2026年9月7日
    100
  • 在sql的select语句中用于实现选择运算的是什么

    在sql的select语句中,用于实现选择运算的是“WHERE”。在SQL的查询语句中,WHERE子句用于指定查询条件,只有满足条件的元组才会出现在结果集中。 本教程操作环境:windows7系统、mysql5.8版、Dell G3电脑。 在sql的select语句中,用于实现选择运算的是“WHER…

    2026年9月6日
    200
  • sql存储过程的写法是什么

    写法为“CREATE PROCEDURE 过程名 ([过程参数]) 过程体 [过程参数 ] 格式 [IN|OUT|INOUT] 参数名 类型”。过程名应当尽量避免选取与内置函数相同的名称,否则会发生错误;过程体以BEGIN开始,END结束。 本教程操作环境:windows7系统、mysql5.8版、…

    2026年9月6日
    100
  • SQL的核心语句是什么

    SQL语言的核心语句是:SELECT语句,用于从表中选取数据。SQL全称Structured Query Language(结构化查询语言),其核心是数据查询,其查询语言只有一条,即SELECT语句。 本教程操作环境:windows7系统、mysql5.8版、Dell G3电脑。 SQL语言的核心语…

    2026年9月6日
    100
  • 表示修改一个数据库对象的SQL关键字是什么

    表示修改一个数据库对象的SQL关键字是:ALTER。在数据库中,可以使用“ALTER TABLE”语句来改变原有表的结构,可以在已有的表中添加、删除或修改列。 本教程操作环境:windows7系统、mysql8版、Dell G3电脑。 表示修改一个数据库对象的SQL关键字是:alte。 SQL AL…

    2026年9月6日
    000

发表回复

登录后才能评论
关注微信