当前位置:七道奇文章资讯数据防范MSSQL防范
日期:2011-05-02 15:20:00  来源:本站整理

SQLServer和Oracle避免数据锁定的对比[MSSQL防范]

赞助商链接



  本文“SQLServer和Oracle避免数据锁定的对比[MSSQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

sql server和Oracle避免数据锁定的对比

廖铮www.chinai tp 采集 ow er.comKegMw

2002-5-30 14:23:50


数据库并行拜候,也就是两个或两以上用户同时拜候同一数据,这也是数据库引擎若何计划和实现适度反映所面对的最大问题.计划优异、性能出色的数据库引擎可以轻松地同时为不计其数的用户服务.而"底气不足"的数据库系统随着更多的用户同时拜候系统将大大降低其性能.最糟糕的情形下乃至大概招致系统的崩溃.
当然,并行拜候是任何数据库办理筹划都最为器重的问题了,为了办理并行拜候方面的问题各类数据库系统提出了各种各样的筹划. 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编程的时刻应当尽大概地把交易代码计划得既小又快.
在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;
代码返回两行数据,以下所示:
SQLServer和Oracle避免数据锁定的对比
然后,再翻开另一个SQLPlus实例——更新实例来履行以下号令:
SQL> update hr.employees
2 set salary = salary * 1.05
3 where
4 department_id = 20
5 /
代码履行后答复消息称两行数据已被更新.
注意,以上代码中并每有像在SQL Server示例那样键入"begin tran"字样的代码.Oracle 的SQLPlus隐含启用交易(你还可以模拟SQL Server的行为,设置"autocommit to on"自动地提交交易).接下来我们在SQLPlus更新实例中再履行同查询实例一样的select语句.
SQLServer和Oracle避免数据锁定的对比
后果清楚地表明:Michael和Pat的薪水都增添了,但是这个时刻我还没有提交数据变更交易.
目前转到第1个SQLPlus查询实例重新运行查询,后果以下:
SQLServer和Oracle避免数据锁定的对比
Oracle不需求用户等候数据更新实例中操作被提交,它径直返回Michael和Pat的查询信息,但实际上返回的是数据更新开始之前的数据视图!
这时刻,熟习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能否就可以真正实现具体条件下的数据一致性.
  以上是“SQLServer和Oracle避免数据锁定的对比[MSSQL防范]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • sqlserver索引的原理及索引成立的注意事项小结
  • sqlserver数据库主键的生成方法小结(sqlserver,mysql)
  • sqlserver主键计划的注意点
  • CREATE FUNCTION sqlserver用户定义函数
  • 利用cmd号令行窗口操作SqlServer的办法
  • sqlserver bcp(数据导入导出工具)普通用法与号令详解
  • 重命名SQLServer数据库的办法
  • 利用SqlBulkCopy时应注意Sqlserver表中利用缺省值的列
  • sqlserver中将varchar范例转换为int型再举行排序的办法
  • sqlserver 改正列名及表名的sql语句
  • SQLServer顶用T—SQL号令查询一个数据库中有哪些表的sql语句
  • sqlserver 脚本和批处理指令小结
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .